X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fcommon%2Fgamemodes%2Fgamemode%2Fonslaught%2Fsv_onslaught.qc;h=fd050df0a0f541cc0137303fe86ad15ab26ba60b;hp=f09e21fdbeeda068ddeea608219adfa84e13973e;hb=50d6cb6a02a959a7303b5b687631b664a807b26f;hpb=fa4d71afab8ff75d2781bef2a39ec991d0cb1822 diff --git a/qcsrc/common/gamemodes/gamemode/onslaught/sv_onslaught.qc b/qcsrc/common/gamemodes/gamemode/onslaught/sv_onslaught.qc index f09e21fdb..fd050df0a 100644 --- a/qcsrc/common/gamemodes/gamemode/onslaught/sv_onslaught.qc +++ b/qcsrc/common/gamemodes/gamemode/onslaught/sv_onslaught.qc @@ -38,9 +38,7 @@ bool clientcamera_send(entity this, entity to, int sf) { WriteHeader(MSG_ENTITY, ENT_ONSCAMERA); - WriteCoord(MSG_ENTITY, this.origin_x); - WriteCoord(MSG_ENTITY, this.origin_y); - WriteCoord(MSG_ENTITY, this.origin_z); + WriteVector(MSG_ENTITY, this.origin); WriteAngle(MSG_ENTITY, this.angles_x); WriteAngle(MSG_ENTITY, this.angles_y); @@ -68,7 +66,7 @@ void ons_CaptureShield_Touch(entity this, entity toucher) vector mymid = (this.absmin + this.absmax) * 0.5; vector theirmid = (toucher.absmin + toucher.absmax) * 0.5; - Damage(toucher, this, this, 0, DEATH_HURTTRIGGER.m_id, mymid, normalize(theirmid - mymid) * ons_captureshield_force); + Damage(toucher, this, this, 0, DEATH_HURTTRIGGER.m_id, DMG_NOWEP, mymid, normalize(theirmid - mymid) * ons_captureshield_force); if(IS_REAL_CLIENT(toucher)) { @@ -143,8 +141,8 @@ void onslaught_updatelinks() { l.islinked = false; l.isshielded = true; - int i; - for(i = 0; i < 17; ++i) { l.isgenneighbor[i] = false; l.iscpneighbor[i] = false; } + l.aregensneighbor = 0; + l.arecpsneighbor = 0; LOG_DEBUG(etos(l), " (point) belongs to team ", ftos(l.team)); l.sprite.SendFlags |= 16; } @@ -188,9 +186,9 @@ void onslaught_updatelinks() l.enemy.isshielded = false; } if(l.goalentity.classname == "onslaught_generator") - l.enemy.isgenneighbor[l.goalentity.team] = true; + l.enemy.aregensneighbor |= BIT(l.goalentity.team); else - l.enemy.iscpneighbor[l.goalentity.team] = true; + l.enemy.arecpsneighbor |= BIT(l.goalentity.team); } if (l.enemy.islinked) { @@ -200,9 +198,9 @@ void onslaught_updatelinks() l.goalentity.isshielded = false; } if(l.enemy.classname == "onslaught_generator") - l.goalentity.isgenneighbor[l.enemy.team] = true; + l.goalentity.aregensneighbor |= BIT(l.enemy.team); else - l.goalentity.iscpneighbor[l.enemy.team] = true; + l.goalentity.arecpsneighbor |= BIT(l.enemy.team); } } // now update the generators @@ -272,15 +270,11 @@ bool ons_Link_Send(entity this, entity to, int sendflags) WriteByte(MSG_ENTITY, sendflags); if(sendflags & 1) { - WriteCoord(MSG_ENTITY, this.goalentity.origin_x); - WriteCoord(MSG_ENTITY, this.goalentity.origin_y); - WriteCoord(MSG_ENTITY, this.goalentity.origin_z); + WriteVector(MSG_ENTITY, this.goalentity.origin); } if(sendflags & 2) { - WriteCoord(MSG_ENTITY, this.enemy.origin_x); - WriteCoord(MSG_ENTITY, this.enemy.origin_y); - WriteCoord(MSG_ENTITY, this.enemy.origin_z); + WriteVector(MSG_ENTITY, this.enemy.origin); } if(sendflags & 4) { @@ -328,8 +322,8 @@ void ons_DelayedLinkSetup(entity this) int ons_ControlPoint_CanBeLinked(entity cp, int teamnumber) { - if(cp.isgenneighbor[teamnumber]) { return 2; } - if(cp.iscpneighbor[teamnumber]) { return 1; } + if(cp.aregensneighbor & BIT(teamnumber)) return 2; + if(cp.arecpsneighbor & BIT(teamnumber)) return 1; return 0; } @@ -381,7 +375,7 @@ int ons_ControlPoint_Attackable(entity cp, int teamnumber) return 0; } -void ons_ControlPoint_Icon_Damage(entity this, entity inflictor, entity attacker, float damage, int deathtype, vector hitloc, vector force) +void ons_ControlPoint_Icon_Damage(entity this, entity inflictor, entity attacker, float damage, int deathtype, .entity weaponentity, vector hitloc, vector force) { if(damage <= 0) { return; } @@ -406,11 +400,11 @@ void ons_ControlPoint_Icon_Damage(entity this, entity inflictor, entity attacker ons_notification_time[this.team] = time; } - this.health = this.health - damage; + TakeResource(this, RESOURCE_HEALTH, damage); if(this.owner.iscaptured) - WaypointSprite_UpdateHealth(this.owner.sprite, this.health); + WaypointSprite_UpdateHealth(this.owner.sprite, GetResourceAmount(this, RESOURCE_HEALTH)); else - WaypointSprite_UpdateBuildFinished(this.owner.sprite, time + (this.max_health - this.health) / (this.count / ONS_CP_THINKRATE)); + WaypointSprite_UpdateBuildFinished(this.owner.sprite, time + (this.max_health - GetResourceAmount(this, RESOURCE_HEALTH)) / (this.count / ONS_CP_THINKRATE)); this.pain_finished = time + 1; // particles on every hit pointparticles(EFFECT_SPARKS, hitloc, force*-1, 1); @@ -420,14 +414,14 @@ void ons_ControlPoint_Icon_Damage(entity this, entity inflictor, entity attacker else sound(this, CH_TRIGGER, SND_ONS_HIT2, VOL_BASE+0.3, ATTEN_NORM); - if (this.health < 0) + if (GetResourceAmount(this, RESOURCE_HEALTH) < 0) { sound(this, CH_TRIGGER, SND_GRENADE_IMPACT, VOL_BASE, ATTEN_NORM); pointparticles(EFFECT_ROCKET_EXPLODE, this.origin, '0 0 0', 1); Send_Notification(NOTIF_ALL, NULL, MSG_INFO, APP_TEAM_NUM(this.team, INFO_ONSLAUGHT_CPDESTROYED), this.owner.message, attacker.netname); - PlayerScore_Add(attacker, SP_ONS_TAKES, 1); - PlayerScore_Add(attacker, SP_SCORE, 10); + GameRules_scoring_add(attacker, ONS_TAKES, 1); + GameRules_scoring_add(attacker, SCORE, 10); this.owner.goalentity = NULL; this.owner.islinked = false; @@ -453,6 +447,21 @@ void ons_ControlPoint_Icon_Damage(entity this, entity inflictor, entity attacker this.SendFlags |= CPSF_STATUS; } +bool ons_ControlPoint_Icon_Heal(entity targ, entity inflictor, float amount, float limit) +{ + float true_limit = ((limit != RESOURCE_LIMIT_NONE) ? limit : targ.max_health); + if(GetResourceAmount(targ, RESOURCE_HEALTH) <= 0 || GetResourceAmount(targ, RESOURCE_HEALTH) >= true_limit) + return false; + + GiveResourceWithLimit(targ, RESOURCE_HEALTH, amount, true_limit); + if(targ.owner.iscaptured) + WaypointSprite_UpdateHealth(targ.owner.sprite, GetResourceAmount(targ, RESOURCE_HEALTH)); + else + WaypointSprite_UpdateBuildFinished(targ.owner.sprite, time + (targ.max_health - GetResourceAmount(targ, RESOURCE_HEALTH)) / (targ.count / ONS_CP_THINKRATE)); + targ.SendFlags |= CPSF_STATUS; + return true; +} + void ons_ControlPoint_Icon_Think(entity this) { this.nextthink = time + ONS_CP_THINKRATE; @@ -475,23 +484,21 @@ void ons_ControlPoint_Icon_Think(entity this) _friendly_count = _friendly_count * (autocvar_g_onslaught_cp_proxydecap_dps * ONS_CP_THINKRATE); _enemy_count = _enemy_count * (autocvar_g_onslaught_cp_proxydecap_dps * ONS_CP_THINKRATE); - this.health = bound(0, this.health + (_friendly_count - _enemy_count), this.max_health); + GiveResourceWithLimit(this, RESOURCE_HEALTH, (_friendly_count - _enemy_count), this.max_health); this.SendFlags |= CPSF_STATUS; - if(this.health <= 0) + if(GetResourceAmount(this, RESOURCE_HEALTH) <= 0) { - ons_ControlPoint_Icon_Damage(this, this, this, 1, 0, this.origin, '0 0 0'); + ons_ControlPoint_Icon_Damage(this, this, this, 1, 0, DMG_NOWEP, this.origin, '0 0 0'); return; } } if (time > this.pain_finished + 5) { - if(this.health < this.max_health) + if(GetResourceAmount(this, RESOURCE_HEALTH) < this.max_health) { - this.health = this.health + this.count; - if (this.health >= this.max_health) - this.health = this.max_health; - WaypointSprite_UpdateHealth(this.owner.sprite, this.health); + GiveResourceWithLimit(this, RESOURCE_HEALTH, this.count, this.max_health); + WaypointSprite_UpdateHealth(this.owner.sprite, GetResourceAmount(this, RESOURCE_HEALTH)); } } @@ -510,7 +517,7 @@ void ons_ControlPoint_Icon_Think(entity this) } // damaged fx - if(random() < 0.6 - this.health / this.max_health) + if(random() < 0.6 - GetResourceAmount(this, RESOURCE_HEALTH) / this.max_health) { Send_Effect(EFFECT_ELECTRIC_SPARKS, this.origin + randompos('-10 -10 -20', '10 10 20'), '0 0 0', 1); @@ -532,13 +539,13 @@ void ons_ControlPoint_Icon_BuildThink(entity this) if(!a) return; - this.health = this.health + this.count; + GiveResource(this, RESOURCE_HEALTH, this.count); this.SendFlags |= CPSF_STATUS; - if (this.health >= this.max_health) + if (GetResourceAmount(this, RESOURCE_HEALTH) >= this.max_health) { - this.health = this.max_health; + SetResourceAmountExplicit(this, RESOURCE_HEALTH, this.max_health); this.count = autocvar_g_onslaught_cp_regen * ONS_CP_THINKRATE; // slow repair rate from now on setthink(this, ons_ControlPoint_Icon_Think); sound(this, CH_TRIGGER, SND_ONS_CONTROLPOINT_BUILT, VOL_BASE, ATTEN_NORM); @@ -548,15 +555,15 @@ void ons_ControlPoint_Icon_BuildThink(entity this) Send_Effect(EFFECT_CAP(this.owner.team), this.owner.origin, '0 0 0', 1); WaypointSprite_UpdateMaxHealth(this.owner.sprite, this.max_health); - WaypointSprite_UpdateHealth(this.owner.sprite, this.health); + WaypointSprite_UpdateHealth(this.owner.sprite, GetResourceAmount(this, RESOURCE_HEALTH)); if(IS_PLAYER(this.owner.ons_toucher)) { Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_ONSLAUGHT_CAPTURE, this.owner.ons_toucher.netname, this.owner.message); Send_Notification(NOTIF_ALL_EXCEPT, this.owner.ons_toucher, MSG_CENTER, APP_TEAM_NUM(this.owner.ons_toucher.team, CENTER_ONS_CAPTURE_TEAM), this.owner.message); Send_Notification(NOTIF_ONE, this.owner.ons_toucher, MSG_CENTER, CENTER_ONS_CAPTURE, this.owner.message); - PlayerScore_Add(this.owner.ons_toucher, SP_ONS_CAPS, 1); - PlayerTeamScore_AddScore(this.owner.ons_toucher, 10); + GameRules_scoring_add(this.owner.ons_toucher, ONS_CAPS, 1); + GameRules_scoring_add_team(this.owner.ons_toucher, SCORE, 10); } this.owner.ons_toucher = NULL; @@ -571,7 +578,7 @@ void ons_ControlPoint_Icon_BuildThink(entity this) if(this.owner.model != MDL_ONS_CP_PAD2.model_str()) setmodel_fixsize(this.owner, MDL_ONS_CP_PAD2); - if(random() < 0.9 - this.health / this.max_health) + if(random() < 0.9 - GetResourceAmount(this, RESOURCE_HEALTH) / this.max_health) Send_Effect(EFFECT_RAGE, this.origin + 10 * randomvec(), '0 0 -1', 1); } @@ -586,15 +593,16 @@ void ons_ControlPoint_Icon_Spawn(entity cp, entity player) e.owner = cp; e.max_health = autocvar_g_onslaught_cp_health; - e.health = autocvar_g_onslaught_cp_buildhealth; + SetResourceAmountExplicit(e, RESOURCE_HEALTH, autocvar_g_onslaught_cp_buildhealth); e.solid = SOLID_NOT; e.takedamage = DAMAGE_AIM; e.bot_attack = true; IL_PUSH(g_bot_targets, e); e.event_damage = ons_ControlPoint_Icon_Damage; + e.event_heal = ons_ControlPoint_Icon_Heal; e.team = player.team; e.colormap = 1024 + (e.team - 1) * 17; - e.count = (e.max_health - e.health) * ONS_CP_THINKRATE / autocvar_g_onslaught_cp_buildtime; // how long it takes to build + e.count = (e.max_health - GetResourceAmount(e, RESOURCE_HEALTH)) * ONS_CP_THINKRATE / autocvar_g_onslaught_cp_buildtime; // how long it takes to build sound(e, CH_TRIGGER, SND_ONS_CONTROLPOINT_BUILD, VOL_BASE, ATTEN_NORM); @@ -604,7 +612,7 @@ void ons_ControlPoint_Icon_Spawn(entity cp, entity player) Send_Effect(EFFECT_FLAG_TOUCH(player.team), e.origin, '0 0 0', 1); - WaypointSprite_UpdateBuildFinished(cp.sprite, time + (e.max_health - e.health) / (e.count / ONS_CP_THINKRATE)); + WaypointSprite_UpdateBuildFinished(cp.sprite, time + (e.max_health - GetResourceAmount(e, RESOURCE_HEALTH)) / (e.count / ONS_CP_THINKRATE)); WaypointSprite_UpdateRule(cp.sprite,cp.team,SPRITERULE_TEAMPLAY); cp.sprite.SendFlags |= 16; @@ -646,7 +654,7 @@ void ons_ControlPoint_UpdateSprite(entity e) else { WaypointSprite_UpdateMaxHealth(e.sprite, e.goalentity.max_health); - WaypointSprite_UpdateHealth(e.sprite, e.goalentity.health); + WaypointSprite_UpdateHealth(e.sprite, GetResourceAmount(e.goalentity, RESOURCE_HEALTH)); } } if(e.lastshielded) @@ -841,7 +849,7 @@ void ons_camSetup(entity this) float best_trace_fraction = 0; while(ang.y < 360) { - dir = eX * cos(ang.y * DEG2RAD) + eY * sin(ang.y * DEG2RAD); + dir = vec2(cos(ang.y * DEG2RAD), sin(ang.y * DEG2RAD)); dir *= 500; traceline(this.origin, this.origin - dir, MOVE_WORLDONLY, this); if(trace_fraction > best_trace_fraction) @@ -868,7 +876,7 @@ void ons_camSetup(entity this) WriteAngle(MSG_ALL, cam.angles_z); } -void ons_GeneratorDamage(entity this, entity inflictor, entity attacker, float damage, int deathtype, vector hitloc, vector force) +void ons_GeneratorDamage(entity this, entity inflictor, entity attacker, float damage, int deathtype, .entity weaponentity, vector hitloc, vector force) { if(damage <= 0) return; if(warmup_stage || game_stopped) return; @@ -895,14 +903,14 @@ void ons_GeneratorDamage(entity this, entity inflictor, entity attacker, float d play2team(this.team, SND(ONS_GENERATOR_UNDERATTACK)); } } - this.health = this.health - damage; - WaypointSprite_UpdateHealth(this.sprite, this.health); + TakeResource(this, RESOURCE_HEALTH, damage); + WaypointSprite_UpdateHealth(this.sprite, GetResourceAmount(this, RESOURCE_HEALTH)); // choose an animation frame based on health - this.frame = 10 * bound(0, (1 - this.health / this.max_health), 1); + this.frame = 10 * bound(0, (1 - GetResourceAmount(this, RESOURCE_HEALTH) / this.max_health), 1); // see if the generator is still functional, or dying - if (this.health > 0) + if (GetResourceAmount(this, RESOURCE_HEALTH) > 0) { - this.lasthealth = this.health; + this.lasthealth = GetResourceAmount(this, RESOURCE_HEALTH); } else { @@ -911,13 +919,14 @@ void ons_GeneratorDamage(entity this, entity inflictor, entity attacker, float d else { Send_Notification(NOTIF_ALL, NULL, MSG_INFO, APP_TEAM_NUM(this.team, INFO_ONSLAUGHT_GENDESTROYED)); - PlayerScore_Add(attacker, SP_SCORE, 100); + GameRules_scoring_add(attacker, SCORE, 100); } this.iscaptured = false; this.islinked = false; this.isshielded = false; this.takedamage = DAMAGE_NO; // can't be hurt anymore this.event_damage = func_null; // won't do anything if hurt + this.event_heal = func_null; this.count = 0; // reset counter setthink(this, func_null); this.nextthink = 0; @@ -952,31 +961,46 @@ void ons_GeneratorDamage(entity this, entity inflictor, entity attacker, float d this.SendFlags |= GSF_STATUS; } +bool ons_GeneratorHeal(entity targ, entity inflictor, float amount, float limit) +{ + float true_limit = ((limit != RESOURCE_LIMIT_NONE) ? limit : targ.max_health); + if(GetResourceAmount(targ, RESOURCE_HEALTH) <= 0 || GetResourceAmount(targ, RESOURCE_HEALTH) >= true_limit) + return false; + + GiveResourceWithLimit(targ, RESOURCE_HEALTH, amount, true_limit); + WaypointSprite_UpdateHealth(targ.sprite, GetResourceAmount(targ, RESOURCE_HEALTH)); + targ.frame = 10 * bound(0, (1 - GetResourceAmount(targ, RESOURCE_HEALTH) / targ.max_health), 1); + targ.lasthealth = GetResourceAmount(targ, RESOURCE_HEALTH); + targ.SendFlags |= GSF_STATUS; + return true; +} + void ons_GeneratorThink(entity this) { this.nextthink = time + GEN_THINKRATE; - if (!game_stopped) + + if (game_stopped || this.isshielded || time < this.wait) + return; + + this.wait = time + 5; + FOREACH_CLIENT(IS_PLAYER(it) && IS_REAL_CLIENT(it), { - if(!this.isshielded && this.wait < time) + if (SAME_TEAM(it, this)) { - this.wait = time + 5; - FOREACH_CLIENT(IS_PLAYER(it) && IS_REAL_CLIENT(it), { - if(SAME_TEAM(it, this)) - { - Send_Notification(NOTIF_ONE, it, MSG_CENTER, CENTER_ONS_NOTSHIELDED_TEAM); - soundto(MSG_ONE, it, CHAN_AUTO, SND(KH_ALARM), VOL_BASE, ATTEN_NONE); // FIXME: unique sound? - } - else - Send_Notification(NOTIF_ONE, it, MSG_CENTER, APP_TEAM_NUM(this.team, CENTER_ONS_NOTSHIELDED)); - }); + Send_Notification(NOTIF_ONE, it, MSG_CENTER, CENTER_ONS_NOTSHIELDED_TEAM); + msg_entity = it; + soundto(MSG_ONE, this, CHAN_AUTO, SND(KH_ALARM), VOL_BASE, ATTEN_NONE); // FIXME: unique sound? } - } + else + Send_Notification(NOTIF_ONE, it, MSG_CENTER, APP_TEAM_NUM(this.team, CENTER_ONS_NOTSHIELDED)); + }); } void ons_GeneratorReset(entity this) { this.team = this.team_saved; - this.lasthealth = this.max_health = this.health = autocvar_g_onslaught_gen_health; + SetResourceAmountExplicit(this, RESOURCE_HEALTH, autocvar_g_onslaught_gen_health); + this.lasthealth = this.max_health = autocvar_g_onslaught_gen_health; this.takedamage = DAMAGE_AIM; this.bot_attack = true; if(!IL_CONTAINS(g_bot_targets, this)) @@ -985,6 +1009,7 @@ void ons_GeneratorReset(entity this) this.islinked = true; this.isshielded = true; this.event_damage = ons_GeneratorDamage; + this.event_heal = ons_GeneratorHeal; setthink(this, ons_GeneratorThink); this.nextthink = time + GEN_THINKRATE; @@ -994,7 +1019,7 @@ void ons_GeneratorReset(entity this) this.SendFlags |= GSF_STATUS; WaypointSprite_UpdateMaxHealth(this.sprite, this.max_health); - WaypointSprite_UpdateHealth(this.sprite, this.health); + WaypointSprite_UpdateHealth(this.sprite, GetResourceAmount(this, RESOURCE_HEALTH)); WaypointSprite_UpdateRule(this.sprite,this.team,SPRITERULE_TEAMPLAY); onslaught_updatelinks(); @@ -1039,12 +1064,15 @@ void ons_GeneratorSetup(entity gen) // called when spawning a generator entity o gen.classname = "onslaught_generator"; gen.solid = SOLID_BBOX; gen.team_saved = teamnumber; + IL_PUSH(g_saved_team, gen); set_movetype(gen, MOVETYPE_NONE); - gen.lasthealth = gen.max_health = gen.health = autocvar_g_onslaught_gen_health; + gen.lasthealth = gen.max_health = autocvar_g_onslaught_gen_health; + SetResourceAmountExplicit(gen, RESOURCE_HEALTH, autocvar_g_onslaught_gen_health); gen.takedamage = DAMAGE_AIM; gen.bot_attack = true; IL_PUSH(g_bot_targets, gen); gen.event_damage = ons_GeneratorDamage; + gen.event_heal = ons_GeneratorHeal; gen.reset = ons_GeneratorReset; setthink(gen, ons_GeneratorThink); gen.nextthink = time + GEN_THINKRATE; @@ -1066,7 +1094,7 @@ void ons_GeneratorSetup(entity gen) // called when spawning a generator entity o WaypointSprite_SpawnFixed(WP_Null, gen.origin + CPGEN_WAYPOINT_OFFSET, gen, sprite, RADARICON_NONE); WaypointSprite_UpdateRule(gen.sprite, gen.team, SPRITERULE_TEAMPLAY); WaypointSprite_UpdateMaxHealth(gen.sprite, gen.max_health); - WaypointSprite_UpdateHealth(gen.sprite, gen.health); + WaypointSprite_UpdateHealth(gen.sprite, GetResourceAmount(gen, RESOURCE_HEALTH)); InitializeEntity(gen, ons_DelayedGeneratorSetup, INITPRIO_SETLOCATION); } @@ -1084,10 +1112,10 @@ void Onslaught_count_generators() for(e = ons_worldgeneratorlist; e; e = e.ons_worldgeneratornext) { ++total_generators; - redowned += (e.team == NUM_TEAM_1 && e.health > 0); - blueowned += (e.team == NUM_TEAM_2 && e.health > 0); - yellowowned += (e.team == NUM_TEAM_3 && e.health > 0); - pinkowned += (e.team == NUM_TEAM_4 && e.health > 0); + redowned += (e.team == NUM_TEAM_1 && GetResourceAmount(e, RESOURCE_HEALTH) > 0); + blueowned += (e.team == NUM_TEAM_2 && GetResourceAmount(e, RESOURCE_HEALTH) > 0); + yellowowned += (e.team == NUM_TEAM_3 && GetResourceAmount(e, RESOURCE_HEALTH) > 0); + pinkowned += (e.team == NUM_TEAM_4 && GetResourceAmount(e, RESOURCE_HEALTH) > 0); } } @@ -1154,7 +1182,7 @@ bool Onslaught_CheckWinner() else d = d * tmp_entity.max_health / max(30, 60 * autocvar_timelimit_suddendeath); - Damage(tmp_entity, tmp_entity, tmp_entity, d, DEATH_HURTTRIGGER.m_id, tmp_entity.origin, '0 0 0'); + Damage(tmp_entity, tmp_entity, tmp_entity, d, DEATH_HURTTRIGGER.m_id, DMG_NOWEP, tmp_entity.origin, '0 0 0'); tmp_entity.sprite.SendFlags |= 16; @@ -1228,13 +1256,13 @@ void havocbot_goalrating_ons_offenseitems(entity this, float ratingscale, vector bool needarmor = false, needweapons = false; // Needs armor/health? - if(this.health<100) + if(GetResourceAmount(this, RESOURCE_HEALTH) < 100) needarmor = true; // Needs weapons? int c = 0; FOREACH(Weapons, it != WEP_Null, { - if(this.weapons & (it.m_wepset)) + if(STAT(WEAPONS, this) & (it.m_wepset)) if(++c >= 4) break; }); @@ -1253,7 +1281,7 @@ void havocbot_goalrating_ons_offenseitems(entity this, float ratingscale, vector { // gather health and armor only if (it.solid) - if ( ((it.health || it.armorvalue) && needarmor) || (it.weapons && needweapons ) ) + if ( ((GetResourceAmount(it, RESOURCE_HEALTH) || GetResourceAmount(it, RESOURCE_ARMOR)) && needarmor) || (STAT(WEAPONS, it) && needweapons ) ) if (vdist(it.origin - org, <, sradius)) { int t = it.bot_pickupevalfunc(this, it); @@ -1307,7 +1335,7 @@ void havocbot_goalrating_ons_controlpoints_attack(entity this, float ratingscale continue; // Ignore owned controlpoints - if(!(cp2.isgenneighbor[this.team] || cp2.iscpneighbor[this.team])) + if(!((cp2.aregensneighbor & BIT(this.team)) || (cp2.arecpsneighbor & BIT(this.team)))) continue; // Count team mates interested in this control point @@ -1376,8 +1404,8 @@ void havocbot_goalrating_ons_controlpoints_attack(entity this, float ratingscale best.cnt += 1; this.havocbot_attack_time = 0; - if(checkpvs(this.view_ofs,cp)) - if(checkpvs(this.view_ofs,best)) + if(checkpvs(this.origin + this.view_ofs, cp)) + if(checkpvs(this.origin + this.view_ofs, best)) this.havocbot_attack_time = time + 2; } else @@ -1447,8 +1475,8 @@ bool havocbot_goalrating_ons_generator_attack(entity this, float ratingscale) bestwp.cnt += 1; this.havocbot_attack_time = 0; - if(checkpvs(this.view_ofs,g)) - if(checkpvs(this.view_ofs,bestwp)) + if(checkpvs(this.origin + this.view_ofs, g)) + if(checkpvs(this.origin + this.view_ofs, bestwp)) this.havocbot_attack_time = time + 5; return true; @@ -1487,7 +1515,7 @@ void havocbot_role_ons_offense(entity this) if(this.havocbot_attack_time>time) return; - if (this.bot_strategytime < time) + if (navigation_goalrating_timeout(this)) { navigation_goalrating_start(this); havocbot_goalrating_enemyplayers(this, 20000, this.origin, 650); @@ -1496,7 +1524,7 @@ void havocbot_role_ons_offense(entity this) havocbot_goalrating_ons_offenseitems(this, 10000, this.origin, 10000); navigation_goalrating_end(this); - this.bot_strategytime = time + autocvar_bot_ai_strategyinterval; + navigation_goalrating_timeout_set(this); } } @@ -1977,7 +2005,7 @@ MUTATOR_HOOKFUNCTION(ons, SV_ParseClientCommand) { entity source_point = ons_Nearest_ControlPoint(player, player.origin, autocvar_g_onslaught_teleport_radius); - if ( !source_point && player.health > 0 ) + if ( !source_point && GetResourceAmount(player, RESOURCE_HEALTH) > 0 ) { sprint(player, "\nYou need to be next to a control point\n"); return true; @@ -1992,7 +2020,7 @@ MUTATOR_HOOKFUNCTION(ons, SV_ParseClientCommand) return true; } - if ( player.health <= 0 ) + if ( GetResourceAmount(player, RESOURCE_HEALTH) <= 0 ) { player.ons_spawn_by = closest_target; player.respawn_flags = player.respawn_flags | RESPAWN_FORCE; @@ -2058,14 +2086,14 @@ MUTATOR_HOOKFUNCTION(ons, SendWaypoint) { entity wp_owner = wp.owner; entity e = WaypointSprite_getviewentity(to); - if(SAME_TEAM(e, wp_owner) && wp_owner.goalentity.health >= wp_owner.goalentity.max_health) { wp_flag |= 2; } + if(SAME_TEAM(e, wp_owner) && GetResourceAmount(wp_owner.goalentity, RESOURCE_HEALTH) >= wp_owner.goalentity.max_health) { wp_flag |= 2; } if(!ons_ControlPoint_Attackable(wp_owner, e.team)) { wp_flag |= 2; } } if(wp.owner.classname == "onslaught_generator") { entity wp_owner = wp.owner; - if(wp_owner.isshielded && wp_owner.health >= wp_owner.max_health) { wp_flag |= 2; } - if(wp_owner.health <= 0) { wp_flag |= 2; } + if(wp_owner.isshielded && GetResourceAmount(wp_owner, RESOURCE_HEALTH) >= wp_owner.max_health) { wp_flag |= 2; } + if(GetResourceAmount(wp_owner, RESOURCE_HEALTH) <= 0) { wp_flag |= 2; } } } @@ -2173,11 +2201,11 @@ void ons_ScoreRules() if(c2 >= 0) teams |= BIT(1); if(c3 >= 0) teams |= BIT(2); if(c4 >= 0) teams |= BIT(3); - ScoreRules_basics(teams, SFL_SORT_PRIO_PRIMARY, 0, true); - ScoreInfo_SetLabel_TeamScore (ST_ONS_CAPS, "destroyed", SFL_SORT_PRIO_PRIMARY); - ScoreInfo_SetLabel_PlayerScore(SP_ONS_CAPS, "caps", SFL_SORT_PRIO_SECONDARY); - ScoreInfo_SetLabel_PlayerScore(SP_ONS_TAKES, "takes", 0); - ScoreRules_basics_end(); + GameRules_scoring(teams, SFL_SORT_PRIO_PRIMARY, 0, { + field_team(ST_ONS_CAPS, "destroyed", SFL_SORT_PRIO_PRIMARY); + field(SP_ONS_CAPS, "caps", SFL_SORT_PRIO_SECONDARY); + field(SP_ONS_TAKES, "takes", 0); + }); } void ons_DelayedInit(entity this) // Do this check with a delay so we can wait for teams to be set up