From: Samual Date: Sat, 31 Mar 2012 04:37:27 +0000 (-0400) Subject: Begin implementing ctf_Handle_Dropped_Capture() X-Git-Tag: xonotic-v0.7.0~240^2~149 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=785e32a688e61bdd25fbbb78aaabc7d97c0150d7;p=xonotic%2Fxonotic-data.pk3dir.git Begin implementing ctf_Handle_Dropped_Capture() --- diff --git a/defaultXonotic.cfg b/defaultXonotic.cfg index 3553f5626..0c525d797 100644 --- a/defaultXonotic.cfg +++ b/defaultXonotic.cfg @@ -608,6 +608,7 @@ set g_ctf_flag_return_when_unreachable 1 "automatically return the flag if it fa set g_ctf_throw_velocity 500 "how far a player can throw the flag" set g_ctf_allow_pass 1 "allow passing of flags to nearby team mates" set g_ctf_pass_radius 200 "maximum radius that you can pass to a team mate in" +set g_Ctf_dropped_capture_radius 100 "allow dropped flags to be automatically captured by base flags if the dropped flag is within this radius of it" set g_ctf_shield_max_ratio 0 "shield at most this percentage of a team from the enemy flag (try: 0.4 for 40%)" diff --git a/qcsrc/server/autocvars.qh b/qcsrc/server/autocvars.qh index 165a8e71a..68191f127 100644 --- a/qcsrc/server/autocvars.qh +++ b/qcsrc/server/autocvars.qh @@ -789,6 +789,7 @@ float autocvar_g_ctf_shield_force; float autocvar_g_ctf_shield_max_ratio; float autocvar_g_ctf_shield_min_negscore; float autocvar_g_ctf_reverse; +float autocvar_g_ctf_dropped_capture_radius; float autocvar_g_cts_finish_kill_delay; float autocvar_g_cts_selfdamage; float autocvar_g_debug_bot_commands; diff --git a/qcsrc/server/mutators/gamemode_ctf.qc b/qcsrc/server/mutators/gamemode_ctf.qc index 8264c8090..87c372b36 100644 --- a/qcsrc/server/mutators/gamemode_ctf.qc +++ b/qcsrc/server/mutators/gamemode_ctf.qc @@ -235,6 +235,66 @@ void ctf_Handle_Drop(entity player, float droptype) dprint("FLAG FALLTHROUGH will happen SOON\n"); } +void ctf_Handle_Dropped_Capture(entity flag, entity enemy_flag) +{ + /* + // declarations + float cap_time, cap_record, success; + string cap_message, refername; + + entity player = enemy_flag.dropperid; + + // records + if((autocvar_g_ctf_captimerecord_always) || (player_count - currentbots)) { + cap_record = ctf_captimerecord; + cap_time = (time - player.flagcarried.ctf_pickuptime); + + refername = db_get(ServerProgsDB, strcat(GetMapname(), "/captimerecord/netname")); + refername = ((refername == player.netname) ? "their" : strcat(refername, "^7's")); + + if(!ctf_captimerecord) + { cap_message = strcat(" in ", ftos_decimals(cap_time, 2), " seconds"); success = TRUE; } + else if(cap_time < cap_record) + { cap_message = strcat(" in ", ftos_decimals(cap_time, 2), " seconds, breaking ", refername, " previous record of ", ftos_decimals(cap_record, 2), " seconds"); success = TRUE; } + else + { cap_message = strcat(" in ", ftos_decimals(cap_time, 2), " seconds, failing to break ", refername, " record of ", ftos_decimals(cap_record, 2), " seconds"); success = FALSE; } + + if(success) { + ctf_captimerecord = cap_time; + db_put(ServerProgsDB, strcat(GetMapname(), "/captimerecord/time"), ftos(cap_time)); + db_put(ServerProgsDB, strcat(GetMapname(), "/captimerecord/netname"), player.netname); + write_recordmarker(player, (time - cap_time), cap_time); } } + + // messages and sounds + Send_KillNotification(player.netname, player.flagcarried.netname, cap_message, INFO_CAPTUREFLAG, MSG_INFO); + sound(player, CH_TRIGGER, flag.snd_flag_capture, VOL_BASE, ATTN_NONE); // "ctf/*_capture.wav" + ctf_EventLog("capture", player.flagcarried.team, player); + + // scoring + PlayerTeamScore_AddScore(player, ctf_ReadScore("score_capture")); + PlayerTeamScore_Add(player, SP_CTF_CAPS, ST_CTF_CAPS, 1); + + // effects + if (autocvar_g_ctf_flag_capture_effects) + { + pointparticles(particleeffectnum((player.team == COLOR_TEAM1) ? "red_ground_quake" : "blue_ground_quake"), flag.origin, '0 0 0', 1); + //shockwave_spawn("models/ctf/shockwavetransring.md3", flag.origin - '0 0 15', -0.8, 0, 1); + } + + // waypointsprites + WaypointSprite_Kill(player.wps_flagcarrier); + + // reset the flag + if(flag.speedrunning) { ctf_FakeTimeLimit(player, -1); } + + */ + + sound(flag, CH_TRIGGER, flag.snd_flag_capture, VOL_BASE, ATTN_NONE); + print("dropped capture! :D\n"); + + ctf_RespawnFlag(enemy_flag); +} + void ctf_Handle_Capture(entity flag, entity player) { // declarations @@ -471,7 +531,7 @@ void ctf_FlagThink() // sanity checks if(self.mins != FLAG_MIN || self.maxs != FLAG_MAX) { // reset the flag boundaries in case it got squished - dprint("wtf the flag got squished?\n"); + dprint("wtf the flag got squashed?\n"); tracebox(self.origin, FLAG_MIN, FLAG_MAX, self.origin, MOVE_NOMONSTERS, self); if(!trace_startsolid) // can we resize it without getting stuck? setsize(self, FLAG_MIN, FLAG_MAX); } @@ -481,7 +541,14 @@ void ctf_FlagThink() { case FLAG_BASE: { - + for(tmp_entity = ctf_worldflaglist; tmp_entity; tmp_entity = tmp_entity.ctf_worldflagnext) + { + if(tmp_entity.ctf_status == FLAG_DROPPED) + if(vlen(self.origin - tmp_entity.origin) < autocvar_g_ctf_dropped_capture_radius) + { + ctf_Handle_Dropped_Capture(self, tmp_entity); + } + } return; } @@ -811,8 +878,7 @@ MUTATOR_HOOKFUNCTION(ctf_PlayerUseKey) head = head.chain; } - if(closest_target) { ctf_Handle_Pass(player, closest_target); } - return 0; + if(closest_target) { ctf_Handle_Pass(player, closest_target); return 0; } } if(autocvar_g_ctf_allow_drop) { ctf_Handle_Drop(player, DROPTYPE_THROWN); }