X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fmutators%2Fmutator_buffs.qc;h=765619df7e488305bc0222f0737d3bdb974c609f;hb=c4fb6d591478d37e1957d0beec6137887ef05569;hp=38d262ca73637ccbbf22f6cad233c7a1a3e8cebd;hpb=5aff30682b3eec74e0110d293290b22071d13240;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/mutators/mutator_buffs.qc b/qcsrc/server/mutators/mutator_buffs.qc index 38d262ca7..765619df7 100644 --- a/qcsrc/server/mutators/mutator_buffs.qc +++ b/qcsrc/server/mutators/mutator_buffs.qc @@ -1,10 +1,16 @@ float buffs_BuffModel_Customize() { - float same_team = (SAME_TEAM(other, self.owner) || (IS_SPEC(other) && SAME_TEAM(other.enemy, self.owner))); - if(self.owner.alpha <= 0.5 && !same_team && self.owner.alpha != 0) + entity player, myowner; + float same_team; + + player = WaypointSprite_getviewentity(other); + myowner = self.owner; + same_team = (SAME_TEAM(player, myowner) || SAME_TEAM(player, myowner)); + + if(myowner.alpha <= 0.5 && !same_team && myowner.alpha != 0) return FALSE; - - if(other == self.owner || (IS_SPEC(other) && other.enemy == self.owner)) + + if(player == myowner || (IS_SPEC(other) && other.enemy == myowner)) { // somewhat hide the model, but keep the glow self.effects = 0; @@ -23,7 +29,7 @@ float buff_Waypoint_visible_for_player(entity plr) { if(!self.owner.buff_active && !self.owner.buff_activetime) return FALSE; - + if(plr.buffs) { if(plr.cvar_cl_buffs_autoreplace) @@ -40,7 +46,7 @@ float buff_Waypoint_visible_for_player(entity plr) void buff_Waypoint_Spawn(entity e) { - WaypointSprite_Spawn(Buff_PrettyName(e.buffs), 0, autocvar_g_buffs_waypoint_distance, e, '0 0 1' * e.maxs_z, world, e.team, e, buff_waypoint, TRUE, RADARICON_POWERUP, e.glowmod); + WaypointSprite_Spawn(Buff_Sprite(e.buffs), 0, autocvar_g_buffs_waypoint_distance, e, '0 0 1' * e.maxs_z, world, e.team, e, buff_waypoint, TRUE, RADARICON_POWERUP, e.glowmod); WaypointSprite_UpdateTeamRadar(e.buff_waypoint, RADARICON_POWERUP, e.glowmod); e.buff_waypoint.waypointsprite_visible_for_player = buff_Waypoint_visible_for_player; } @@ -66,10 +72,16 @@ void buff_Respawn(entity ent) if(!MoveToRandomMapLocation(ent, DPCONTENTS_SOLID | DPCONTENTS_CORPSE | DPCONTENTS_PLAYERCLIP, DPCONTENTS_SLIME | DPCONTENTS_LAVA | DPCONTENTS_SKY | DPCONTENTS_BODY | DPCONTENTS_DONOTENTER, Q3SURFACEFLAG_SKY, ((autocvar_g_buffs_random_location_attempts > 0) ? autocvar_g_buffs_random_location_attempts : 10), 1024, 256)) { entity spot = SelectSpawnPoint(TRUE); - setorigin(self, (spot.origin + '0 0 200') + (randomvec() * 300)); - self.angles = spot.angles; + setorigin(ent, ((spot.origin + '0 0 200') + (randomvec() * 300))); + ent.angles = spot.angles; } + tracebox(ent.origin, ent.mins * 1.5, self.maxs * 1.5, ent.origin, MOVE_NOMONSTERS, ent); + + setorigin(ent, trace_endpos); // attempt to unstick + + ent.movetype = MOVETYPE_TOSS; + makevectors(ent.angles); ent.velocity = '0 0 200'; ent.angles = '0 0 0'; @@ -95,7 +107,7 @@ void buff_Touch() } if((self.team && DIFF_TEAM(other, self)) - || (other.freezetag_frozen) + || (other.frozen) || (other.vehicle) || (!IS_PLAYER(other)) || (!self.buff_active) @@ -188,7 +200,7 @@ void buff_Think() } if(!self.buff_active && !self.buff_activetime) - if(!self.owner || self.owner.freezetag_frozen || self.owner.deadflag != DEAD_NO || !self.owner.iscreature || !(self.owner.buffs & self.buffs)) + if(!self.owner || self.owner.frozen || self.owner.deadflag != DEAD_NO || !self.owner.iscreature || !(self.owner.buffs & self.buffs)) { buff_SetCooldown(autocvar_g_buffs_cooldown_respawn + frametime); self.owner = world; @@ -288,6 +300,9 @@ void buff_Init(entity ent) buff_SetCooldown(autocvar_g_buffs_cooldown_activate + game_starttime); self.buff_active = !self.buff_activetime; self.pflags = PFLAGS_FULLDYNAMIC; + + if(self.noalign) + self.movetype = MOVETYPE_NONE; // reset by random location setmodel(self, "models/relics/relic.md3"); setsize(self, BUFF_MIN, BUFF_MAX); @@ -322,7 +337,7 @@ void buff_SpawnReplacement(entity ent, entity old) // mutator hooks MUTATOR_HOOKFUNCTION(buffs_PlayerDamage_SplitHealthArmor) { - if(DEATH_ISBUFF(frag_deathtype)) { return FALSE; } // oh no you don't + if(frag_deathtype == DEATH_BUFF_VENGEANCE) { return FALSE; } // oh no you don't if(frag_target.buffs & BUFF_RESISTANCE) { @@ -334,9 +349,18 @@ MUTATOR_HOOKFUNCTION(buffs_PlayerDamage_SplitHealthArmor) return FALSE; } +void buff_Vengeance_DelayedDamage() +{ + if(self.enemy) + Damage(self.enemy, self.owner, self.owner, self.dmg, DEATH_BUFF_VENGEANCE, self.enemy.origin, '0 0 0'); + + remove(self); + return; +} + MUTATOR_HOOKFUNCTION(buffs_PlayerDamage_Calculate) { - if(DEATH_ISBUFF(frag_deathtype)) { return FALSE; } // oh no you don't + if(frag_deathtype == DEATH_BUFF_VENGEANCE) { return FALSE; } // oh no you don't if(frag_target.buffs & BUFF_SPEED) if(frag_target != frag_attacker) @@ -347,6 +371,7 @@ MUTATOR_HOOKFUNCTION(buffs_PlayerDamage_Calculate) if(!ITEM_DAMAGE_NEEDKILL(frag_deathtype)) if(frag_attacker) if(random() <= autocvar_g_buffs_medic_survive_chance) + if(frag_target.health - autocvar_g_buffs_medic_survive_health > 0) // not if the final result would be less than 0, medic must get health frag_damage = frag_target.health - autocvar_g_buffs_medic_survive_health; if(frag_target.buffs & BUFF_VENGEANCE) @@ -354,9 +379,13 @@ MUTATOR_HOOKFUNCTION(buffs_PlayerDamage_Calculate) if(frag_attacker != frag_target) if(!ITEM_DAMAGE_NEEDKILL(frag_deathtype)) { - vector v = healtharmor_applydamage(frag_attacker.armorvalue, autocvar_g_balance_armor_blockpercent, DEATH_BUFF_VENGEANCE, frag_damage * autocvar_g_buffs_vengeance_damage_multiplier); - float take = v_x; - Damage(frag_attacker, frag_target, frag_target, take, DEATH_BUFF_VENGEANCE, frag_attacker.origin, '0 0 0'); + entity dmgent = spawn(); + + dmgent.dmg = frag_damage * autocvar_g_buffs_vengeance_damage_multiplier; + dmgent.enemy = frag_attacker; + dmgent.owner = frag_target; + dmgent.think = buff_Vengeance_DelayedDamage; + dmgent.nextthink = time + 0.1; } if(frag_target.buffs & BUFF_BASH) @@ -390,7 +419,7 @@ MUTATOR_HOOKFUNCTION(buffs_PlayerDamage_Calculate) if(frag_target.deadflag == DEAD_NO) if(IS_PLAYER(frag_target) || (frag_target.flags & FL_MONSTER)) if(frag_attacker != frag_target) - if(!frag_target.freezetag_frozen) + if(!frag_target.frozen) if(frag_target.takedamage) if(DIFF_TEAM(frag_attacker, frag_target)) frag_attacker.health = bound(0, frag_attacker.health + bound(0, frag_damage * autocvar_g_buffs_vampire_damage_steal, frag_target.health), g_pickup_healthsmall_max); @@ -428,6 +457,7 @@ MUTATOR_HOOKFUNCTION(buffs_PlayerJump) { if(self.buffs & BUFF_JUMP) player_jumpheight = autocvar_g_buffs_jump_height; + self.stat_jumpheight = player_jumpheight; return FALSE; } @@ -489,6 +519,19 @@ MUTATOR_HOOKFUNCTION(buffs_RemovePlayer) return FALSE; } +MUTATOR_HOOKFUNCTION(buffs_CustomizeWaypoint) +{ + entity e = WaypointSprite_getviewentity(other); + + // if you have the invisibility powerup, sprites ALWAYS are restricted to your team + // but only apply this to real players, not to spectators + if((self.owner.flags & FL_CLIENT) && (self.owner.buffs & BUFF_INVISIBLE) && (e == other)) + if(DIFF_TEAM(self.owner, e)) + return TRUE; + + return FALSE; +} + MUTATOR_HOOKFUNCTION(buffs_OnEntityPreSpawn) { if(autocvar_g_buffs_replace_powerups) @@ -527,7 +570,7 @@ MUTATOR_HOOKFUNCTION(buffs_PlayerThink) self.buff_disability_effect_time = time + 0.5; } - if(self.freezetag_frozen) + if(self.frozen) { if(self.buffs) { @@ -535,11 +578,6 @@ MUTATOR_HOOKFUNCTION(buffs_PlayerThink) self.buffs = 0; } } - - if(!(self.oldbuffs & BUFF_JUMP) && !(self.buffs & BUFF_JUMP)) - self.stat_jumpheight = autocvar_sv_jumpvelocity; // reset so we don't break anything - else if((self.buffs & BUFF_JUMP) && self.stat_jumpheight != autocvar_g_buffs_jump_height) - self.stat_jumpheight = autocvar_g_buffs_jump_height; if((self.buffs & BUFF_INVISIBLE) && (self.oldbuffs & BUFF_INVISIBLE)) if(self.alpha != autocvar_g_buffs_invisible_alpha) @@ -565,21 +603,16 @@ MUTATOR_HOOKFUNCTION(buffs_PlayerThink) if(!self.ammo_fuel) { self.ammo_fuel = 20; } } - if(self.oldbuffs & BUFF_JUMP) - self.stat_jumpheight = autocvar_sv_jumpvelocity; - else if(self.buffs & BUFF_JUMP) - self.stat_jumpheight = autocvar_g_buffs_jump_height; - if(self.oldbuffs & BUFF_INVISIBLE) { - if(time < self.strength_finished && g_minstagib) - self.alpha = autocvar_g_minstagib_invis_alpha; + if(time < self.strength_finished && g_instagib) + self.alpha = autocvar_g_instagib_invis_alpha; else self.alpha = self.buff_invisible_prev_alpha; } else if(self.buffs & BUFF_INVISIBLE) { - if(time < self.strength_finished && g_minstagib) + if(time < self.strength_finished && g_instagib) self.buff_invisible_prev_alpha = default_player_alpha; else self.buff_invisible_prev_alpha = self.alpha; @@ -724,7 +757,7 @@ void buffs_Initialize() MUTATOR_DEFINITION(mutator_buffs) { MUTATOR_HOOK(PlayerDamage_SplitHealthArmor, buffs_PlayerDamage_SplitHealthArmor, CBC_ORDER_ANY); - MUTATOR_HOOK(PlayerDamage_Calculate, buffs_PlayerDamage_Calculate, CBC_ORDER_LAST); + MUTATOR_HOOK(PlayerDamage_Calculate, buffs_PlayerDamage_Calculate, CBC_ORDER_ANY); MUTATOR_HOOK(PlayerSpawn, buffs_PlayerSpawn, CBC_ORDER_ANY); MUTATOR_HOOK(PlayerPhysics, buffs_PlayerPhysics, CBC_ORDER_ANY); MUTATOR_HOOK(PlayerJump, buffs_PlayerJump, CBC_ORDER_ANY); @@ -738,6 +771,7 @@ MUTATOR_DEFINITION(mutator_buffs) MUTATOR_HOOK(MakePlayerObserver, buffs_RemovePlayer, CBC_ORDER_ANY); MUTATOR_HOOK(ClientDisconnect, buffs_RemovePlayer, CBC_ORDER_ANY); MUTATOR_HOOK(OnEntityPreSpawn, buffs_OnEntityPreSpawn, CBC_ORDER_ANY); + MUTATOR_HOOK(CustomizeWaypoint, buffs_CustomizeWaypoint, CBC_ORDER_ANY); MUTATOR_HOOK(WeaponRateFactor, buffs_WeaponRate, CBC_ORDER_ANY); MUTATOR_HOOK(PlayerPreThink, buffs_PlayerThink, CBC_ORDER_ANY); MUTATOR_HOOK(GetCvars, buffs_GetCvars, CBC_ORDER_ANY);