X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fmutators%2Fmutator%2Fbuffs%2Fbuffs.qc;h=01e7f31bb362db86d008d0f7f45d491de621aadb;hb=5eea97bc262bfaf271817ca034439ad551f691d4;hp=7de2a906201ff55964e6971440fc383ee8b7e838;hpb=834fed09016056ff2cd32d1980f0719d09c403a2;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/mutators/mutator/buffs/buffs.qc b/qcsrc/common/mutators/mutator/buffs/buffs.qc index 7de2a9062..01e7f31bb 100644 --- a/qcsrc/common/mutators/mutator/buffs/buffs.qc +++ b/qcsrc/common/mutators/mutator/buffs/buffs.qc @@ -82,7 +82,7 @@ const vector BUFF_MAX = ('16 16 20'); #include .float buff_time = _STAT(BUFF_TIME); -void buffs_DelayedInit(); +void buffs_DelayedInit(entity this); REGISTER_MUTATOR(buffs, cvar("g_buffs")) { @@ -92,8 +92,8 @@ REGISTER_MUTATOR(buffs, cvar("g_buffs")) } } -bool buffs_BuffModel_Customize() -{SELFPARAM(); +bool buffs_BuffModel_Customize(entity this) +{ entity player, myowner; bool same_team; @@ -132,7 +132,7 @@ void buffs_BuffModel_Spawn(entity player) player.buff_model.scale = 0.7; player.buff_model.pflags = PFLAGS_FULLDYNAMIC; player.buff_model.light_lev = 200; - player.buff_model.customizeentityforclient = buffs_BuffModel_Customize; + setcefc(player.buff_model, buffs_BuffModel_Customize); } vector buff_GlowColor(entity buff) @@ -153,17 +153,17 @@ void buff_Effect(entity player, string eff) } // buff item -float buff_Waypoint_visible_for_player(entity plr) -{SELFPARAM(); - if(!self.owner.buff_active && !self.owner.buff_activetime) +bool buff_Waypoint_visible_for_player(entity this, entity player, entity view) +{ + if(!this.owner.buff_active && !this.owner.buff_activetime) return false; - if (plr.buffs) + if (view.buffs) { - return plr.cvar_cl_buffs_autoreplace == false || plr.buffs != self.owner.buffs; + return view.cvar_cl_buffs_autoreplace == false || view.buffs != this.owner.buffs; } - return WaypointSprite_visible_for_player(plr); + return WaypointSprite_visible_for_player(this, player, view); } void buff_Waypoint_Spawn(entity e) @@ -175,16 +175,16 @@ void buff_Waypoint_Spawn(entity e) e.buff_waypoint.waypointsprite_visible_for_player = buff_Waypoint_visible_for_player; } -void buff_SetCooldown(float cd) -{SELFPARAM(); +void buff_SetCooldown(entity this, float cd) +{ cd = max(0, cd); - if(!self.buff_waypoint) - buff_Waypoint_Spawn(self); + if(!this.buff_waypoint) + buff_Waypoint_Spawn(this); - WaypointSprite_UpdateBuildFinished(self.buff_waypoint, time + cd); - self.buff_activetime = cd; - self.buff_active = !cd; + WaypointSprite_UpdateBuildFinished(this.buff_waypoint, time + cd); + this.buff_activetime = cd; + this.buff_active = !cd; } void buff_Respawn(entity this) @@ -197,7 +197,7 @@ void buff_Respawn(entity this) if(!MoveToRandomMapLocation(this, 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); + entity spot = SelectSpawnPoint(this, true); setorigin(this, spot.origin); this.velocity = ((randomvec() * 100) + '0 0 200'); this.angles = spot.angles; @@ -222,8 +222,8 @@ void buff_Respawn(entity this) sound(this, CH_TRIGGER, SND_KA_RESPAWN, VOL_BASE, ATTEN_NONE); // ATTEN_NONE (it's a sound intended to be heard anywhere) } -void buff_Touch() -{SELFPARAM(); +void buff_Touch(entity this) +{ if(gameover) { return; } if(ITEM_TOUCH_NEEDKILL()) @@ -298,82 +298,82 @@ void buff_NewType(entity ent, float cb) ent.buffs = RandomSelection_chosen_float; } -void buff_Think() -{SELFPARAM(); - if(self.buffs != self.oldbuffs) +void buff_Think(entity this) +{ + if(this.buffs != this.oldbuffs) { - entity buff = buff_FirstFromFlags(self.buffs); - self.color = buff.m_color; - self.glowmod = buff_GlowColor(buff); - self.skin = buff.m_skin; + entity buff = buff_FirstFromFlags(this.buffs); + this.color = buff.m_color; + this.glowmod = buff_GlowColor(buff); + this.skin = buff.m_skin; - setmodel(self, MDL_BUFF); + setmodel(this, MDL_BUFF); - if(self.buff_waypoint) + if(this.buff_waypoint) { - //WaypointSprite_Disown(self.buff_waypoint, 1); - WaypointSprite_Kill(self.buff_waypoint); - buff_Waypoint_Spawn(self); - if(self.buff_activetime) - WaypointSprite_UpdateBuildFinished(self.buff_waypoint, time + self.buff_activetime - frametime); + //WaypointSprite_Disown(this.buff_waypoint, 1); + WaypointSprite_Kill(this.buff_waypoint); + buff_Waypoint_Spawn(this); + if(this.buff_activetime) + WaypointSprite_UpdateBuildFinished(this.buff_waypoint, time + this.buff_activetime - frametime); } - self.oldbuffs = self.buffs; + this.oldbuffs = this.buffs; } if(!gameover) if((round_handler_IsActive() && !round_handler_IsRoundStarted()) || time >= game_starttime) - if(!self.buff_activetime_updated) + if(!this.buff_activetime_updated) { - buff_SetCooldown(self.buff_activetime); - self.buff_activetime_updated = true; + buff_SetCooldown(this, this.buff_activetime); + this.buff_activetime_updated = true; } - if(!self.buff_active && !self.buff_activetime) - if(!self.owner || STAT(FROZEN, self.owner) || IS_DEAD(self.owner) || !self.owner.iscreature || !(self.owner.buffs & self.buffs)) + if(!this.buff_active && !this.buff_activetime) + if(!this.owner || STAT(FROZEN, this.owner) || IS_DEAD(this.owner) || !this.owner.iscreature || !(this.owner.buffs & this.buffs)) { - buff_SetCooldown(autocvar_g_buffs_cooldown_respawn + frametime); - self.owner = world; + buff_SetCooldown(this, autocvar_g_buffs_cooldown_respawn + frametime); + this.owner = world; if(autocvar_g_buffs_randomize) - buff_NewType(self, self.buffs); + buff_NewType(this, this.buffs); - if(autocvar_g_buffs_random_location || (self.spawnflags & 64)) - buff_Respawn(self); + if(autocvar_g_buffs_random_location || (this.spawnflags & 64)) + buff_Respawn(this); } - if(self.buff_activetime) + if(this.buff_activetime) if(!gameover) if((round_handler_IsActive() && !round_handler_IsRoundStarted()) || time >= game_starttime) { - self.buff_activetime = max(0, self.buff_activetime - frametime); + this.buff_activetime = max(0, this.buff_activetime - frametime); - if(!self.buff_activetime) + if(!this.buff_activetime) { - self.buff_active = true; - sound(self, CH_TRIGGER, SND_STRENGTH_RESPAWN, VOL_BASE, ATTN_NORM); - Send_Effect(EFFECT_ITEM_RESPAWN, CENTER_OR_VIEWOFS(self), '0 0 0', 1); + this.buff_active = true; + sound(this, CH_TRIGGER, SND_STRENGTH_RESPAWN, VOL_BASE, ATTN_NORM); + Send_Effect(EFFECT_ITEM_RESPAWN, CENTER_OR_VIEWOFS(this), '0 0 0', 1); } } - if(self.buff_active) + if(this.buff_active) { - if(self.team && !self.buff_waypoint) - buff_Waypoint_Spawn(self); + if(this.team && !this.buff_waypoint) + buff_Waypoint_Spawn(this); - if(self.lifetime) - if(time >= self.lifetime) - buff_Respawn(self); + if(this.lifetime) + if(time >= this.lifetime) + buff_Respawn(this); } - self.nextthink = time; - //self.angles_y = time * 110.1; + this.nextthink = time; + //this.angles_y = time * 110.1; } -void buff_Waypoint_Reset() -{SELFPARAM(); - WaypointSprite_Kill(self.buff_waypoint); +void buff_Waypoint_Reset(entity this) +{ + WaypointSprite_Kill(this.buff_waypoint); - if(self.buff_activetime) { buff_Waypoint_Spawn(self); } + if(this.buff_activetime) { buff_Waypoint_Spawn(this); } } void buff_Reset(entity this) @@ -381,79 +381,76 @@ void buff_Reset(entity this) if(autocvar_g_buffs_randomize) buff_NewType(this, this.buffs); this.owner = world; - buff_SetCooldown(autocvar_g_buffs_cooldown_activate); - buff_Waypoint_Reset(); + buff_SetCooldown(this, autocvar_g_buffs_cooldown_activate); + buff_Waypoint_Reset(this); this.buff_activetime_updated = false; if(autocvar_g_buffs_random_location || (this.spawnflags & 64)) buff_Respawn(this); } -float buff_Customize() -{SELFPARAM(); +float buff_Customize(entity this) +{ entity player = WaypointSprite_getviewentity(other); - if(!self.buff_active || (self.team && DIFF_TEAM(player, self))) + if(!this.buff_active || (this.team && DIFF_TEAM(player, this))) { - self.alpha = 0.3; - if(self.effects & EF_FULLBRIGHT) { self.effects &= ~(EF_FULLBRIGHT); } - self.pflags = 0; + this.alpha = 0.3; + if(this.effects & EF_FULLBRIGHT) { this.effects &= ~(EF_FULLBRIGHT); } + this.pflags = 0; } else { - self.alpha = 1; - if(!(self.effects & EF_FULLBRIGHT)) { self.effects |= EF_FULLBRIGHT; } - self.light_lev = 220 + 36 * sin(time); - self.pflags = PFLAGS_FULLDYNAMIC; + this.alpha = 1; + if(!(this.effects & EF_FULLBRIGHT)) { this.effects |= EF_FULLBRIGHT; } + this.light_lev = 220 + 36 * sin(time); + this.pflags = PFLAGS_FULLDYNAMIC; } return true; } -void buff_Init(entity ent) -{SELFPARAM(); - if(!cvar("g_buffs")) { remove(ent); return; } - - if(!teamplay && ent.team) { ent.team = 0; } - - entity buff = buff_FirstFromFlags(self.buffs); - - setself(ent); - if(!self.buffs || buff_Available(buff)) - buff_NewType(self, 0); - - self.classname = "item_buff"; - self.solid = SOLID_TRIGGER; - self.flags = FL_ITEM; - self.think = buff_Think; - self.touch = buff_Touch; - self.reset = buff_Reset; - self.nextthink = time + 0.1; - self.gravity = 1; - self.movetype = MOVETYPE_TOSS; - self.scale = 1; - self.skin = buff.m_skin; - self.effects = EF_FULLBRIGHT | EF_STARDUST | EF_NOSHADOW; - self.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY; - self.customizeentityforclient = buff_Customize; - //self.gravity = 100; - self.color = buff.m_color; - self.glowmod = buff_GlowColor(self); - buff_SetCooldown(autocvar_g_buffs_cooldown_activate + game_starttime); - self.buff_active = !self.buff_activetime; - self.pflags = PFLAGS_FULLDYNAMIC; - - if(self.spawnflags & 1) - self.noalign = true; - - if(self.noalign) - self.movetype = MOVETYPE_NONE; // reset by random location - - setmodel(self, MDL_BUFF); - setsize(self, BUFF_MIN, BUFF_MAX); - - if(cvar("g_buffs_random_location") || (self.spawnflags & 64)) - buff_Respawn(self); +void buff_Init(entity this) +{ + if(!cvar("g_buffs")) { remove(this); return; } + + if(!teamplay && this.team) { this.team = 0; } + + entity buff = buff_FirstFromFlags(this.buffs); + + if(!this.buffs || buff_Available(buff)) + buff_NewType(this, 0); - setself(this); + this.classname = "item_buff"; + this.solid = SOLID_TRIGGER; + this.flags = FL_ITEM; + setthink(this, buff_Think); + settouch(this, buff_Touch); + this.reset = buff_Reset; + this.nextthink = time + 0.1; + this.gravity = 1; + this.movetype = MOVETYPE_TOSS; + this.scale = 1; + this.skin = buff.m_skin; + this.effects = EF_FULLBRIGHT | EF_STARDUST | EF_NOSHADOW; + this.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY; + setcefc(this, buff_Customize); + //this.gravity = 100; + this.color = buff.m_color; + this.glowmod = buff_GlowColor(this); + buff_SetCooldown(this, autocvar_g_buffs_cooldown_activate + game_starttime); + this.buff_active = !this.buff_activetime; + this.pflags = PFLAGS_FULLDYNAMIC; + + if(this.spawnflags & 1) + this.noalign = true; + + if(this.noalign) + this.movetype = MOVETYPE_NONE; // reset by random location + + setmodel(this, MDL_BUFF); + setsize(this, BUFF_MIN, BUFF_MAX); + + if(cvar("g_buffs_random_location") || (this.spawnflags & 64)) + buff_Respawn(this); } void buff_Init_Compat(entity ent, entity replacement) @@ -477,12 +474,12 @@ void buff_SpawnReplacement(entity ent, entity old) buff_Init(ent); } -void buff_Vengeance_DelayedDamage() -{SELFPARAM(); - if(self.enemy) - Damage(self.enemy, self.owner, self.owner, self.dmg, DEATH_BUFF.m_id, self.enemy.origin, '0 0 0'); +void buff_Vengeance_DelayedDamage(entity this) +{ + if(this.enemy) + Damage(this.enemy, this.owner, this.owner, this.dmg, DEATH_BUFF.m_id, this.enemy.origin, '0 0 0'); - remove(self); + remove(this); return; } @@ -508,13 +505,17 @@ float buff_Inferno_CalculateTime(float x, float offset_x, float offset_y, float // mutator hooks MUTATOR_HOOKFUNCTION(buffs, PlayerDamage_SplitHealthArmor) { + entity frag_target = M_ARGV(2, entity); + float frag_deathtype = M_ARGV(6, float); + float frag_damage = M_ARGV(7, float); + if(frag_deathtype == DEATH_BUFF.m_id) { return false; } if(frag_target.buffs & BUFF_RESISTANCE.m_itemid) { vector v = healtharmor_applydamage(50, autocvar_g_buffs_resistance_blockpercent, frag_deathtype, frag_damage); - damage_take = v.x; - damage_save = v.y; + M_ARGV(4, float) = v.x; // take + M_ARGV(5, float) = v.y; // save } return false; @@ -522,6 +523,12 @@ MUTATOR_HOOKFUNCTION(buffs, PlayerDamage_SplitHealthArmor) MUTATOR_HOOKFUNCTION(buffs, PlayerDamage_Calculate) { + entity frag_attacker = M_ARGV(1, entity); + entity frag_target = M_ARGV(2, entity); + float frag_deathtype = M_ARGV(3, float); + float frag_damage = M_ARGV(4, float); + vector frag_force = M_ARGV(6, vector); + if(frag_deathtype == DEATH_BUFF.m_id) { return false; } if(frag_target.buffs & BUFF_SPEED.m_itemid) @@ -549,7 +556,7 @@ MUTATOR_HOOKFUNCTION(buffs, PlayerDamage_Calculate) dmgent.dmg = frag_damage * autocvar_g_buffs_vengeance_damage_multiplier; dmgent.enemy = frag_attacker; dmgent.owner = frag_target; - dmgent.think = buff_Vengeance_DelayedDamage; + setthink(dmgent, buff_Vengeance_DelayedDamage); dmgent.nextthink = time + 0.1; } @@ -611,15 +618,20 @@ MUTATOR_HOOKFUNCTION(buffs, PlayerDamage_Calculate) frag_attacker.armorvalue = bound(0, frag_attacker.armorvalue + bound(0, frag_damage * autocvar_g_buffs_vampire_damage_steal, frag_target.armorvalue), g_pickup_armorsmall_max); } + M_ARGV(4, float) = frag_damage; + M_ARGV(6, vector) = frag_force; + return false; } -MUTATOR_HOOKFUNCTION(buffs,PlayerSpawn) -{SELFPARAM(); - self.buffs = 0; +MUTATOR_HOOKFUNCTION(buffs, PlayerSpawn) +{ + entity player = M_ARGV(0, entity); + + player.buffs = 0; // reset timers here to prevent them continuing after re-spawn - self.buff_disability_time = 0; - self.buff_disability_effect_time = 0; + player.buff_disability_time = 0; + player.buff_disability_effect_time = 0; return false; } @@ -671,6 +683,8 @@ MUTATOR_HOOKFUNCTION(buffs, MonsterMove) MUTATOR_HOOKFUNCTION(buffs, PlayerDies) { + entity frag_target = M_ARGV(2, entity); + if(frag_target.buffs) { int buffid = buff_FirstFromFlags(frag_target.buffs).m_id; @@ -888,12 +902,11 @@ MUTATOR_HOOKFUNCTION(buffs, PlayerPreThink) if(boxesoverlap(self.absmin - pickup_size, self.absmax + pickup_size, it.absmin, it.absmax)) { - if(it.touch) + if(gettouch(it)) { entity oldother = other; other = self; - WITHSELF(it, it.touch()); - + WITHSELF(it, gettouch(it)(it)); other = oldother; } } @@ -1045,7 +1058,7 @@ MUTATOR_HOOKFUNCTION(buffs, BuildMutatorsPrettyString) return false; } -void buffs_DelayedInit() +void buffs_DelayedInit(entity this) { if(autocvar_g_buffs_spawn_count > 0) if(find(world, classname, "item_buff") == world)