From: Rudolf Polzer Date: Thu, 19 Jan 2012 12:52:13 +0000 (+0100) Subject: porto: turn into superweapon with timer; add cvar g_balance_porto_secondary for porta... X-Git-Tag: xonotic-v0.6.0~111^2~9 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=a53565053c0dd6f4765ff2595f549e2edfcf86fe;p=xonotic%2Fxonotic-data.pk3dir.git porto: turn into superweapon with timer; add cvar g_balance_porto_secondary for portal gun (still in and out portal are separate) --- diff --git a/balance25.cfg b/balance25.cfg index f65ee473f..cd770d72e 100644 --- a/balance25.cfg +++ b/balance25.cfg @@ -627,6 +627,11 @@ set g_balance_porto_primary_refire 1.5 set g_balance_porto_primary_animtime 0.3 set g_balance_porto_primary_speed 2000 set g_balance_porto_primary_lifetime 30 +set g_balance_porto_secondary 0 +set g_balance_porto_secondary_refire 1.5 +set g_balance_porto_secondary_animtime 0.3 +set g_balance_porto_secondary_speed 2000 +set g_balance_porto_secondary_lifetime 30 set g_balance_portal_health 200 // these get recharged whenever the portal is used set g_balance_portal_lifetime 15 // these get recharged whenever the portal is used // }}} diff --git a/balanceFruitieX.cfg b/balanceFruitieX.cfg index 9777b904d..221894627 100644 --- a/balanceFruitieX.cfg +++ b/balanceFruitieX.cfg @@ -627,6 +627,11 @@ set g_balance_porto_primary_refire 1.5 set g_balance_porto_primary_animtime 0.2 set g_balance_porto_primary_speed 2000 set g_balance_porto_primary_lifetime 5 +set g_balance_porto_secondary 0 +set g_balance_porto_secondary_refire 1.5 +set g_balance_porto_secondary_animtime 0.2 +set g_balance_porto_secondary_speed 2000 +set g_balance_porto_secondary_lifetime 5 set g_balance_portal_health 200 // these get recharged whenever the portal is used set g_balance_portal_lifetime 15 // these get recharged whenever the portal is used // }}} diff --git a/balanceXPM.cfg b/balanceXPM.cfg index a15f060d0..001e1d2dc 100644 --- a/balanceXPM.cfg +++ b/balanceXPM.cfg @@ -627,6 +627,11 @@ set g_balance_porto_primary_refire 1.5 set g_balance_porto_primary_animtime 0.3 set g_balance_porto_primary_speed 1000 set g_balance_porto_primary_lifetime 5 +set g_balance_porto_secondary 0 +set g_balance_porto_secondary_refire 1.5 +set g_balance_porto_secondary_animtime 0.3 +set g_balance_porto_secondary_speed 1000 +set g_balance_porto_secondary_lifetime 5 set g_balance_portal_health 200 // these get recharged whenever the portal is used set g_balance_portal_lifetime 15 // these get recharged whenever the portal is used // }}} diff --git a/balanceXonotic.cfg b/balanceXonotic.cfg index d42284a30..4904e1a5b 100644 --- a/balanceXonotic.cfg +++ b/balanceXonotic.cfg @@ -627,6 +627,11 @@ set g_balance_porto_primary_refire 1.5 set g_balance_porto_primary_animtime 0.3 set g_balance_porto_primary_speed 1000 set g_balance_porto_primary_lifetime 5 +set g_balance_porto_secondary 0 +set g_balance_porto_secondary_refire 1.5 +set g_balance_porto_secondary_animtime 0.3 +set g_balance_porto_secondary_speed 1000 +set g_balance_porto_secondary_lifetime 5 set g_balance_portal_health 200 // these get recharged whenever the portal is used set g_balance_portal_lifetime 15 // these get recharged whenever the portal is used // }}} diff --git a/qcsrc/server/autocvars.qh b/qcsrc/server/autocvars.qh index 1111909b3..bdf262cfe 100644 --- a/qcsrc/server/autocvars.qh +++ b/qcsrc/server/autocvars.qh @@ -561,6 +561,11 @@ float autocvar_g_balance_porto_primary_animtime; float autocvar_g_balance_porto_primary_lifetime; float autocvar_g_balance_porto_primary_refire; float autocvar_g_balance_porto_primary_speed; +float autocvar_g_balance_porto_secondary; +float autocvar_g_balance_porto_secondary_animtime; +float autocvar_g_balance_porto_secondary_lifetime; +float autocvar_g_balance_porto_secondary_refire; +float autocvar_g_balance_porto_secondary_speed; float autocvar_g_balance_powerup_invincible_takedamage; float autocvar_g_balance_powerup_invincible_time; float autocvar_g_balance_powerup_strength_damage; diff --git a/qcsrc/server/cl_client.qc b/qcsrc/server/cl_client.qc index ebf4abc4b..ab9a2b0b7 100644 --- a/qcsrc/server/cl_client.qc +++ b/qcsrc/server/cl_client.qc @@ -1919,7 +1919,7 @@ void player_powerups (void) } else { - if (time < self.superweapons_finished) + if (time < self.superweapons_finished || ((self.weapons & WEPBIT_SUPERWEAPONS) && (self.items & IT_UNLIMITED_SUPERWEAPONS))) { self.items = self.items | IT_SUPERWEAPON; sprint(self, "^3You now have a superweapon\n"); diff --git a/qcsrc/server/portals.qc b/qcsrc/server/portals.qc index bf50c9d3c..76af253dc 100644 --- a/qcsrc/server/portals.qc +++ b/qcsrc/server/portals.qc @@ -645,11 +645,7 @@ float Portal_SpawnInPortalAtTrace(entity own, vector dir, float portal_id_val) portal = Portal_Spawn(own, org, ang); if(!portal) - { - // if(!own.portal_out || own.portal_out.portal_id == portal_id_val) - Portal_ClearAll_PortalsOnly(own); return 0; - } portal.portal_id = portal_id_val; Portal_SetInPortal(own, portal); @@ -669,11 +665,7 @@ float Portal_SpawnOutPortalAtTrace(entity own, vector dir, float portal_id_val) portal = Portal_Spawn(own, org, ang); if(!portal) - { - // if(!own.portal_in || own.portal_in.portal_id == portal_id_val) - Portal_ClearAll_PortalsOnly(own); return 0; - } portal.portal_id = portal_id_val; Portal_SetOutPortal(own, portal); diff --git a/qcsrc/server/portals.qh b/qcsrc/server/portals.qh index b2d282cf2..cd0bc0408 100644 --- a/qcsrc/server/portals.qh +++ b/qcsrc/server/portals.qh @@ -8,3 +8,4 @@ float Portal_SpawnInPortalAtTrace(entity own, vector dir, float id); void Portal_ClearWithID(entity own, float id); vector Portal_ApplyTransformToPlayerAngle(vector transform, vector vangle); +void Portal_ClearAll_PortalsOnly(entity own); diff --git a/qcsrc/server/w_porto.qc b/qcsrc/server/w_porto.qc index fb8e427cc..c919c497e 100644 --- a/qcsrc/server/w_porto.qc +++ b/qcsrc/server/w_porto.qc @@ -1,5 +1,5 @@ #ifdef REGISTER_WEAPON -REGISTER_WEAPON(PORTO, w_porto, 0, 0, WEP_TYPE_OTHER, 0, "porto" , "porto", _("Port-O-Launch")) +REGISTER_WEAPON(PORTO, w_porto, 0, 0, WEP_TYPE_OTHER | WEP_FLAG_SUPERWEAPON, 0, "porto" , "porto", _("Port-O-Launch")) #else #ifdef SVQC .entity porto_current; @@ -29,10 +29,14 @@ void W_Porto_Fail (float failhard) } // no portals here! - Portal_ClearWithID(self.realowner, self.portal_id); + if(self.cnt < 0) + { + Portal_ClearWithID(self.realowner, self.portal_id); + } + self.realowner.porto_current = world; - if(!failhard && self.realowner.playerid == self.playerid && self.realowner.deadflag == DEAD_NO && !(self.realowner.weapons & WEPBIT_PORTO)) + if(self.cnt < 0 && !failhard && self.realowner.playerid == self.playerid && self.realowner.deadflag == DEAD_NO && !(self.realowner.weapons & WEPBIT_PORTO)) { setsize (self, '-16 -16 0', '16 16 32'); setorigin(self, self.origin + trace_plane_normal); @@ -77,6 +81,7 @@ void W_Porto_Touch (void) vector norm; // do not use PROJECTILE_TOUCH here + // FIXME but DO handle warpzones! if(other.classname == "portal") return; // handled by the portal @@ -109,6 +114,42 @@ void W_Porto_Touch (void) { sound(self, CH_SHOTS, "porto/unsupported.wav", VOL_BASE, ATTN_NORM); W_Porto_Fail(0); + if(self.cnt < 0) + Portal_ClearAll_PortalsOnly(self.realowner); + } + else if(self.cnt == 0) + { + // in-portal only + if(Portal_SpawnInPortalAtTrace(self.realowner, self.right_vector, self.portal_id)) + { + sound(self, CH_SHOTS, "porto/create.wav", VOL_BASE, ATTN_NORM); + trace_plane_normal = norm; + centerprint(self.realowner, "^1In^7-portal created."); + W_Porto_Success(); + } + else + { + sound(self, CH_SHOTS, "porto/unsupported.wav", VOL_BASE, ATTN_NORM); + trace_plane_normal = norm; + W_Porto_Fail(0); + } + } + else if(self.cnt == 1) + { + // out-portal only + if(Portal_SpawnOutPortalAtTrace(self.realowner, self.right_vector, self.portal_id)) + { + sound(self, CH_SHOTS, "porto/create.wav", VOL_BASE, ATTN_NORM); + trace_plane_normal = norm; + centerprint(self.realowner, "^1Out^7-portal created."); + W_Porto_Success(); + } + else + { + sound(self, CH_SHOTS, "porto/unsupported.wav", VOL_BASE, ATTN_NORM); + trace_plane_normal = norm; + W_Porto_Fail(0); + } } else if(self.effects & EF_RED) { @@ -126,6 +167,7 @@ void W_Porto_Touch (void) { sound(self, CH_SHOTS, "porto/unsupported.wav", VOL_BASE, ATTN_NORM); trace_plane_normal = norm; + Portal_ClearAll_PortalsOnly(self.realowner); W_Porto_Fail(0); } } @@ -143,23 +185,29 @@ void W_Porto_Touch (void) else { sound(self, CH_SHOTS, "porto/unsupported.wav", VOL_BASE, ATTN_NORM); + Portal_ClearAll_PortalsOnly(self.realowner); W_Porto_Fail(0); } } else { sound(self, CH_SHOTS, "porto/unsupported.wav", VOL_BASE, ATTN_NORM); + Portal_ClearAll_PortalsOnly(self.realowner); W_Porto_Fail(0); } } } -void W_Porto_Attack (void) +void W_Porto_Attack (float type) { entity gren; - if not(self.items & IT_UNLIMITED_SUPERWEAPONS) - self.weapons = self.weapons - (self.weapons & WEPBIT_PORTO); + if(type == -1) + { + if not(self.items & IT_UNLIMITED_SUPERWEAPONS) + self.weapons = self.weapons - (self.weapons & WEPBIT_PORTO); + } + W_SetupShot (self, FALSE, 4, "porto/fire.wav", CH_WEAPON_A, 0); // always shoot from the eye w_shotdir = v_forward; @@ -168,6 +216,7 @@ void W_Porto_Attack (void) //pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1); gren = spawn (); + gren.cnt = type; gren.owner = gren.realowner = self; gren.playerid = self.playerid; gren.classname = "porto"; @@ -180,13 +229,27 @@ void W_Porto_Attack (void) setorigin(gren, w_shotorg); setsize(gren, '0 0 0', '0 0 0'); - gren.nextthink = time + autocvar_g_balance_porto_primary_lifetime; + if(type > 0) + gren.nextthink = time + autocvar_g_balance_porto_secondary_lifetime; + else + gren.nextthink = time + autocvar_g_balance_porto_primary_lifetime; gren.think = W_Porto_Think; gren.touch = W_Porto_Touch; - if(self.items & IT_STRENGTH) - W_SetupProjectileVelocity(gren, autocvar_g_balance_porto_primary_speed * autocvar_g_balance_powerup_strength_force, 0); + + if(type > 0) + { + if(self.items & IT_STRENGTH) + W_SetupProjectileVelocity(gren, autocvar_g_balance_porto_secondary_speed * autocvar_g_balance_powerup_strength_force, 0); + else + W_SetupProjectileVelocity(gren, autocvar_g_balance_porto_secondary_speed, 0); + } else - W_SetupProjectileVelocity(gren, autocvar_g_balance_porto_primary_speed, 0); + { + if(self.items & IT_STRENGTH) + W_SetupProjectileVelocity(gren, autocvar_g_balance_porto_primary_speed * autocvar_g_balance_powerup_strength_force, 0); + else + W_SetupProjectileVelocity(gren, autocvar_g_balance_porto_primary_speed, 0); + } gren.angles = vectoangles (gren.velocity); gren.flags = FL_PROJECTILE; @@ -199,7 +262,10 @@ void W_Porto_Attack (void) gren.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP; - CSQCProjectile(gren, TRUE, PROJECTILE_PORTO_RED, TRUE); + if(type > 0) + CSQCProjectile(gren, TRUE, PROJECTILE_PORTO_BLUE, TRUE); + else + CSQCProjectile(gren, TRUE, PROJECTILE_PORTO_RED, TRUE); other = gren; MUTATOR_CALLHOOK(EditProjectile); } @@ -219,41 +285,65 @@ float w_porto(float req) { self.BUTTON_ATCK = FALSE; self.BUTTON_ATCK2 = FALSE; - if(bot_aim(autocvar_g_balance_porto_primary_speed, 0, autocvar_g_balance_grenadelauncher_primary_lifetime, FALSE)) - self.BUTTON_ATCK = TRUE; + if(!autocvar_g_balance_porto_secondary) + if(bot_aim(autocvar_g_balance_porto_primary_speed, 0, autocvar_g_balance_grenadelauncher_primary_lifetime, FALSE)) + self.BUTTON_ATCK = TRUE; } else if (req == WR_THINK) { - if(self.porto_v_angle_held) + if(autocvar_g_balance_porto_secondary) { - if(!self.BUTTON_ATCK2) + if (self.BUTTON_ATCK) + if (!self.porto_current) + if (!self.porto_forbidden) + if (weapon_prepareattack(0, autocvar_g_balance_porto_primary_refire)) { - self.porto_v_angle_held = 0; + W_Porto_Attack(0); + weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_porto_primary_animtime, w_ready); + } - ClientData_Touch(self); + if (self.BUTTON_ATCK2) + if (!self.porto_current) + if (!self.porto_forbidden) + if (weapon_prepareattack(1, autocvar_g_balance_porto_secondary_refire)) + { + W_Porto_Attack(1); + weapon_thinkf(WFRAME_FIRE2, autocvar_g_balance_porto_secondary_animtime, w_ready); } } else { - if(self.BUTTON_ATCK2) + if(self.porto_v_angle_held) { - self.porto_v_angle = self.v_angle; - self.porto_v_angle_held = 1; + if(!self.BUTTON_ATCK2) + { + self.porto_v_angle_held = 0; - ClientData_Touch(self); + ClientData_Touch(self); + } + } + else + { + if(self.BUTTON_ATCK2) + { + self.porto_v_angle = self.v_angle; + self.porto_v_angle_held = 1; + + ClientData_Touch(self); + } + } + v_angle_save = self.v_angle; + if(self.porto_v_angle_held) + makevectors(self.porto_v_angle); // override the previously set angles + + if (self.BUTTON_ATCK) + if (!self.porto_current) + if (!self.porto_forbidden) + if (weapon_prepareattack(0, autocvar_g_balance_porto_primary_refire)) + { + W_Porto_Attack(-1); + weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_porto_primary_animtime, w_ready); } - } - v_angle_save = self.v_angle; - if(self.porto_v_angle_held) - makevectors(self.porto_v_angle); // override the previously set angles - - if (self.BUTTON_ATCK) - if (!self.porto_current) - if (!self.porto_forbidden) - if (weapon_prepareattack(0, autocvar_g_balance_porto_primary_refire)) - { - W_Porto_Attack(); - weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_porto_primary_animtime, w_ready); } } else if (req == WR_PRECACHE)