From: Rudolf Polzer <divverent@alientrap.org>
Date: Sat, 23 Oct 2010 07:43:43 +0000 (+0200)
Subject: mutator system: add an EditProjectile hook
X-Git-Tag: xonotic-v0.1.0preview~251
X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=5903038441cb706ec52bc89e136c5d7b5c83cc16;p=xonotic%2Fxonotic-data.pk3dir.git

mutator system: add an EditProjectile hook
---

diff --git a/qcsrc/server/mutators/base.qh b/qcsrc/server/mutators/base.qh
index 73c16a9cd..cdc28f76b 100644
--- a/qcsrc/server/mutators/base.qh
+++ b/qcsrc/server/mutators/base.qh
@@ -112,3 +112,9 @@ MUTATOR_HOOKABLE(GetCvars);
 	// INPUT:
 		float get_cvars_f;
 		string get_cvars_s;
+
+MUTATOR_HOOKABLE(EditProjectile);
+	// can edit any "just fired" projectile
+	// INPUT:
+		entity self;
+		entity other;
diff --git a/qcsrc/server/w_common.qc b/qcsrc/server/w_common.qc
index 99df7041b..0b405ba77 100644
--- a/qcsrc/server/w_common.qc
+++ b/qcsrc/server/w_common.qc
@@ -371,6 +371,8 @@ void fireBallisticBullet(vector start, vector dir, float spread, float pSpeed, f
 
 	proj.oldvelocity = proj.velocity;
 
+	other = proj; MUTATOR_CALLHOOK(EditProjectile);
+
 	if(cvar("g_antilag_bullets"))
 	if(pSpeed >= cvar("g_antilag_bullets"))
 	{
diff --git a/qcsrc/server/w_crylink.qc b/qcsrc/server/w_crylink.qc
index 5d1721f78..44e3967b5 100644
--- a/qcsrc/server/w_crylink.qc
+++ b/qcsrc/server/w_crylink.qc
@@ -206,6 +206,8 @@ void W_Crylink_Attack (void)
 
 		CSQCProjectile(proj, TRUE, (proj.cnt ? PROJECTILE_CRYLINK_BOUNCING : PROJECTILE_CRYLINK), TRUE);
 
+		other = proj; MUTATOR_CALLHOOK(EditProjectile);
+
 		counter = counter + 1;
 	}
 }
@@ -279,6 +281,8 @@ void W_Crylink_Attack2 (void)
 
 		CSQCProjectile(proj, TRUE, (proj.cnt ? PROJECTILE_CRYLINK_BOUNCING : PROJECTILE_CRYLINK), TRUE);
 
+		other = proj; MUTATOR_CALLHOOK(EditProjectile);
+
 		counter = counter + 1;
 	}
 }
diff --git a/qcsrc/server/w_electro.qc b/qcsrc/server/w_electro.qc
index 2268ca7cb..6634837db 100644
--- a/qcsrc/server/w_electro.qc
+++ b/qcsrc/server/w_electro.qc
@@ -136,6 +136,8 @@ void W_Electro_Attack()
 	//sounds bad
 
 	CSQCProjectile(proj, TRUE, PROJECTILE_ELECTRO_BEAM, TRUE);
+
+	other = proj; MUTATOR_CALLHOOK(EditProjectile);
 }
 
 void W_Electro_Attack2()
@@ -182,6 +184,8 @@ void W_Electro_Attack2()
 #endif
 
 	CSQCProjectile(proj, TRUE, PROJECTILE_ELECTRO, FALSE); // no culling, it has sound
+
+	other = proj; MUTATOR_CALLHOOK(EditProjectile);
 }
 
 .vector hook_start, hook_end;
diff --git a/qcsrc/server/w_fireball.qc b/qcsrc/server/w_fireball.qc
index 6b98d37cd..e78bb2bbc 100644
--- a/qcsrc/server/w_fireball.qc
+++ b/qcsrc/server/w_fireball.qc
@@ -155,6 +155,8 @@ void W_Fireball_Attack1()
 	proj.flags = FL_PROJECTILE;
 
 	CSQCProjectile(proj, TRUE, PROJECTILE_FIREBALL, TRUE);
+
+	other = proj; MUTATOR_CALLHOOK(EditProjectile);
 }
 
 void W_Fireball_AttackEffect(float i, vector f_diff)
@@ -289,6 +291,8 @@ void W_Fireball_Attack2()
 	proj.flags = FL_PROJECTILE;
 
 	CSQCProjectile(proj, TRUE, PROJECTILE_FIREMINE, TRUE);
+
+	other = proj; MUTATOR_CALLHOOK(EditProjectile);
 }
 
 void spawnfunc_weapon_fireball (void)
diff --git a/qcsrc/server/w_grenadelauncher.qc b/qcsrc/server/w_grenadelauncher.qc
index 0bc08b8de..e92b2b260 100644
--- a/qcsrc/server/w_grenadelauncher.qc
+++ b/qcsrc/server/w_grenadelauncher.qc
@@ -200,6 +200,8 @@ void W_Grenade_Attack (void)
 		CSQCProjectile(gren, TRUE, PROJECTILE_GRENADE, TRUE);
 	else
 		CSQCProjectile(gren, TRUE, PROJECTILE_GRENADE_BOUNCING, TRUE);
+
+	other = gren; MUTATOR_CALLHOOK(EditProjectile);
 }
 
 void W_Grenade_Attack2 (void)
@@ -244,6 +246,8 @@ void W_Grenade_Attack2 (void)
 		CSQCProjectile(gren, TRUE, PROJECTILE_GRENADE, TRUE);
 	else
 		CSQCProjectile(gren, TRUE, PROJECTILE_GRENADE_BOUNCING, TRUE);
+
+	other = gren; MUTATOR_CALLHOOK(EditProjectile);
 }
 
 void spawnfunc_weapon_grenadelauncher (void)
diff --git a/qcsrc/server/w_hagar.qc b/qcsrc/server/w_hagar.qc
index 1d9e9e698..587c9fccc 100644
--- a/qcsrc/server/w_hagar.qc
+++ b/qcsrc/server/w_hagar.qc
@@ -71,6 +71,8 @@ void W_Hagar_Attack (void)
 	missile.flags = FL_PROJECTILE;
 
 	CSQCProjectile(missile, TRUE, PROJECTILE_HAGAR, TRUE);
+
+	other = missile; MUTATOR_CALLHOOK(EditProjectile);
 }
 
 void W_Hagar_Attack2 (void)
@@ -106,6 +108,8 @@ void W_Hagar_Attack2 (void)
 	missile.flags = FL_PROJECTILE;
 
 	CSQCProjectile(missile, TRUE, PROJECTILE_HAGAR_BOUNCING, TRUE);
+
+	other = missile; MUTATOR_CALLHOOK(EditProjectile);
 }
 
 void spawnfunc_weapon_hagar (void)
diff --git a/qcsrc/server/w_hlac.qc b/qcsrc/server/w_hlac.qc
index 9abb8a7a0..6aaf17414 100644
--- a/qcsrc/server/w_hlac.qc
+++ b/qcsrc/server/w_hlac.qc
@@ -74,6 +74,8 @@ void W_HLAC_Attack (void)
 	missile.projectiledeathtype = WEP_HLAC;
 
 	CSQCProjectile(missile, TRUE, PROJECTILE_HLAC, TRUE);
+
+	other = missile; MUTATOR_CALLHOOK(EditProjectile);
 }
 
 void W_HLAC_Attack2f (void)
@@ -116,6 +118,8 @@ void W_HLAC_Attack2f (void)
 	missile.projectiledeathtype = WEP_HLAC | HITTYPE_SECONDARY;
 
 	CSQCProjectile(missile, TRUE, PROJECTILE_HLAC, TRUE);
+
+	other = missile; MUTATOR_CALLHOOK(EditProjectile);
 }
 
 void W_HLAC_Attack2 (void)
diff --git a/qcsrc/server/w_hook.qc b/qcsrc/server/w_hook.qc
index 70fe77814..334e434c8 100644
--- a/qcsrc/server/w_hook.qc
+++ b/qcsrc/server/w_hook.qc
@@ -93,6 +93,8 @@ void W_Hook_Attack2()
 	gren.flags = FL_PROJECTILE;
 
 	CSQCProjectile(gren, TRUE, PROJECTILE_HOOKBOMB, TRUE);
+
+	other = gren; MUTATOR_CALLHOOK(EditProjectile);
 }
 
 void spawnfunc_weapon_hook (void)
diff --git a/qcsrc/server/w_laser.qc b/qcsrc/server/w_laser.qc
index 18715a9b4..db11eb395 100644
--- a/qcsrc/server/w_laser.qc
+++ b/qcsrc/server/w_laser.qc
@@ -77,6 +77,9 @@ void W_Laser_Attack (float issecondary)
 
 	missile.think = W_Laser_Think;
 	missile.nextthink = time + cvar("g_balance_laser_primary_delay");
+
+	other = missile; MUTATOR_CALLHOOK(EditProjectile);
+
 	if(time >= missile.nextthink)
 	{
 		entity oldself;
diff --git a/qcsrc/server/w_minelayer.qc b/qcsrc/server/w_minelayer.qc
index 8c81d89f7..dc4f48152 100644
--- a/qcsrc/server/w_minelayer.qc
+++ b/qcsrc/server/w_minelayer.qc
@@ -262,6 +262,8 @@ void W_Mine_Attack (void)
 	W_AttachToShotorg(flash, '5 0 0');
 
 	// common properties
+
+	other = mine; MUTATOR_CALLHOOK(EditProjectile);
 }
 
 void spawnfunc_weapon_minelayer (void); // defined in t_items.qc
diff --git a/qcsrc/server/w_porto.qc b/qcsrc/server/w_porto.qc
index 010a0f8b3..65442b21b 100644
--- a/qcsrc/server/w_porto.qc
+++ b/qcsrc/server/w_porto.qc
@@ -200,6 +200,8 @@ void W_Porto_Attack (void)
 	gren.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP;
 
 	CSQCProjectile(gren, TRUE, PROJECTILE_PORTO_RED, TRUE);
+
+	other = gren; MUTATOR_CALLHOOK(EditProjectile);
 }
 
 void spawnfunc_weapon_porto (void)
diff --git a/qcsrc/server/w_rocketlauncher.qc b/qcsrc/server/w_rocketlauncher.qc
index 12f7647e5..c109fc796 100644
--- a/qcsrc/server/w_rocketlauncher.qc
+++ b/qcsrc/server/w_rocketlauncher.qc
@@ -367,6 +367,7 @@ void W_Rocket_Attack (void)
 	W_AttachToShotorg(flash, '5 0 0');
 
 	// common properties
+	other = missile; MUTATOR_CALLHOOK(EditProjectile);
 }
 
 void spawnfunc_weapon_rocketlauncher (void); // defined in t_items.qc
diff --git a/qcsrc/server/w_seeker.qc b/qcsrc/server/w_seeker.qc
index c91e4f408..08b1a6782 100644
--- a/qcsrc/server/w_seeker.qc
+++ b/qcsrc/server/w_seeker.qc
@@ -212,6 +212,8 @@ void Seeker_Fire_Missile(vector f_diff)
 	missile.angles = vectoangles (missile.velocity);
 
 	CSQCProjectile(missile, FALSE, PROJECTILE_SEEKER, TRUE);
+
+	other = missile; MUTATOR_CALLHOOK(EditProjectile);
 }
 
 void Seeker_Vollycontroler_Think()
@@ -351,6 +353,8 @@ void Seeker_Fire_Tag()
 	missile.angles = vectoangles (missile.velocity);
 
 	CSQCProjectile(missile, TRUE, PROJECTILE_TAG, FALSE); // has sound
+
+	other = missile; MUTATOR_CALLHOOK(EditProjectile);
 }
 
 
@@ -424,6 +428,8 @@ void Seeker_Fire_Flac()
 	missile.flags = FL_PROJECTILE;
 
 	CSQCProjectile(missile, TRUE, PROJECTILE_FLAC, TRUE);
+
+	other = missile; MUTATOR_CALLHOOK(EditProjectile);
 }
 
 void spawnfunc_weapon_seeker (void)