X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fcommon%2Fgamemodes%2Fgamemode%2Fonslaught%2Fsv_onslaught.qc;h=f09e21fdbeeda068ddeea608219adfa84e13973e;hp=a18ce34c5d06e83ad98d95a2e606f0034b5bc333;hb=b834eab77489d98d5d722d67c8a96cf6c3549436;hpb=f366b93e1d9e8ebdff81c9277f9958178dcb38d0 diff --git a/qcsrc/common/gamemodes/gamemode/onslaught/sv_onslaught.qc b/qcsrc/common/gamemodes/gamemode/onslaught/sv_onslaught.qc index a18ce34c5..f09e21fdb 100644 --- a/qcsrc/common/gamemodes/gamemode/onslaught/sv_onslaught.qc +++ b/qcsrc/common/gamemodes/gamemode/onslaught/sv_onslaught.qc @@ -28,11 +28,27 @@ float autocvar_g_onslaught_spawn_choose; float autocvar_g_onslaught_click_radius; void FixSize(entity e); +entity cam; // ======================= // CaptureShield Functions // ======================= +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); + + WriteAngle(MSG_ENTITY, this.angles_x); + WriteAngle(MSG_ENTITY, this.angles_y); + WriteAngle(MSG_ENTITY, this.angles_z); + + return true; +} + bool ons_CaptureShield_Customize(entity this, entity client) { entity e = WaypointSprite_getviewentity(client); @@ -537,7 +553,7 @@ void ons_ControlPoint_Icon_BuildThink(entity this) 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), 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); @@ -817,11 +833,46 @@ void ons_Generator_UpdateSprite(entity e) } } +void ons_camSetup(entity this) +{ + vector dir; + vector ang = '0 0 0'; + vector best_ang = '0 0 0'; + float best_trace_fraction = 0; + while(ang.y < 360) + { + dir = eX * cos(ang.y * DEG2RAD) + eY * sin(ang.y * DEG2RAD); + dir *= 500; + traceline(this.origin, this.origin - dir, MOVE_WORLDONLY, this); + if(trace_fraction > best_trace_fraction) + { + best_trace_fraction = trace_fraction; + best_ang = ang; + if(trace_fraction == 1) + break; + } + ang.y += 90; + if(ang.y == 360) + ang.y = 45; + } + cam.origin = this.origin; + setorigin(cam, cam.origin); + cam.angles = best_ang; + Net_LinkEntity(cam, false, 0, clientcamera_send); + + FOREACH_CLIENT(true, it.clientcamera = cam;); + + WriteByte(MSG_ALL, SVC_SETVIEWANGLES); + WriteAngle(MSG_ALL, cam.angles_x); + WriteAngle(MSG_ALL, cam.angles_y); + WriteAngle(MSG_ALL, cam.angles_z); +} + void ons_GeneratorDamage(entity this, entity inflictor, entity attacker, float damage, int deathtype, vector hitloc, vector force) { - if(damage <= 0) { return; } - if(warmup_stage || gameover) { return; } - if(!round_handler_IsRoundStarted()) { return; } + if(damage <= 0) return; + if(warmup_stage || game_stopped) return; + if(!round_handler_IsRoundStarted()) return; if (attacker != this) { @@ -877,6 +928,8 @@ void ons_GeneratorDamage(entity this, entity inflictor, entity attacker, float d //WaypointSprite_Kill(this.sprite); // can't do this yet, code too poor onslaught_updatelinks(); + + ons_camSetup(this); } // Throw some flaming gibs on damage, more damage = more chance for gib @@ -902,7 +955,7 @@ void ons_GeneratorDamage(entity this, entity inflictor, entity attacker, float d void ons_GeneratorThink(entity this) { this.nextthink = time + GEN_THINKRATE; - if (!gameover) + if (!game_stopped) { if(!this.isshielded && this.wait < time) { @@ -926,7 +979,8 @@ void ons_GeneratorReset(entity this) this.lasthealth = this.max_health = this.health = autocvar_g_onslaught_gen_health; this.takedamage = DAMAGE_AIM; this.bot_attack = true; - IL_PUSH(g_bot_targets, this); + if(!IL_CONTAINS(g_bot_targets, this)) + IL_PUSH(g_bot_targets, this); this.iscaptured = true; this.islinked = true; this.isshielded = true; @@ -1141,6 +1195,7 @@ bool Onslaught_CheckWinner() nades_Clear(it); }); + game_stopped = true; return 1; } @@ -1584,7 +1639,7 @@ bool ons_Teleport(entity player, entity tele_target, float range, bool tele_effe loc += tele_target.origin + '0 0 128' * iteration_scale; - tracebox(loc, STAT(PL_MIN, NULL), STAT(PL_MAX, NULL), loc, MOVE_NORMAL, player); + tracebox(loc, STAT(PL_MIN, player), STAT(PL_MAX, player), loc, MOVE_NORMAL, player); if(trace_fraction == 1.0 && !trace_startsolid) { traceline(tele_target.origin, loc, MOVE_NOMONSTERS, tele_target); // double check to make sure we're not spawning outside the NULL @@ -1621,6 +1676,7 @@ MUTATOR_HOOKFUNCTION(ons, reset_map_global) STAT(ROUNDLOST, it) = false; it.ons_deathloc = '0 0 0'; PutClientInServer(it); + it.clientcamera = it; }); return false; } @@ -1702,7 +1758,7 @@ MUTATOR_HOOKFUNCTION(ons, PlayerSpawn) iteration_scale -= i / 10; loc = closest_target.origin + '0 0 96' * iteration_scale; loc += ('0 1 0' * random()) * 128 * iteration_scale; - tracebox(loc, STAT(PL_MIN, NULL), STAT(PL_MAX, NULL), loc, MOVE_NORMAL, player); + tracebox(loc, STAT(PL_MIN, player), STAT(PL_MAX, player), loc, MOVE_NORMAL, player); if(trace_fraction == 1.0 && !trace_startsolid) { traceline(closest_target.origin, loc, MOVE_NOMONSTERS, closest_target); // double check to make sure we're not spawning outside the NULL @@ -1753,7 +1809,7 @@ MUTATOR_HOOKFUNCTION(ons, PlayerSpawn) iteration_scale -= i / 10; loc = closest_target.origin + '0 0 128' * iteration_scale; loc += ('0 1 0' * random()) * 256 * iteration_scale; - tracebox(loc, STAT(PL_MIN, NULL), STAT(PL_MAX, NULL), loc, MOVE_NORMAL, player); + tracebox(loc, STAT(PL_MIN, player), STAT(PL_MAX, player), loc, MOVE_NORMAL, player); if(trace_fraction == 1.0 && !trace_startsolid) { traceline(closest_target.origin, loc, MOVE_NOMONSTERS, closest_target); // double check to make sure we're not spawning outside the NULL @@ -1966,7 +2022,7 @@ MUTATOR_HOOKFUNCTION(ons, SV_ParseClientCommand) MUTATOR_HOOKFUNCTION(ons, PlayerUseKey) { - if(MUTATOR_RETURNVALUE || gameover) { return false; } + if(MUTATOR_RETURNVALUE || game_stopped) return false; entity player = M_ARGV(0, entity); @@ -2137,5 +2193,7 @@ void ons_Initialize() g_onslaught = true; ons_captureshield_force = autocvar_g_onslaught_shield_force; + cam = new(objective_camera); + InitializeEntity(NULL, ons_DelayedInit, INITPRIO_GAMETYPE); }