X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fclient.qc;h=0034c2dd9ee3b687a0b600eee0b850cc056dfb89;hb=af43b181a15f348a4de2045b716ebc7765ce8f9f;hp=af05fd79cf023e31ee8e73ce32f5e0eb4feae123;hpb=fc0889be210898f9a72b4e12ddf30e2ae5effa24;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/client.qc b/qcsrc/server/client.qc index af05fd79c..0034c2dd9 100644 --- a/qcsrc/server/client.qc +++ b/qcsrc/server/client.qc @@ -40,6 +40,7 @@ #include "../common/mapobjects/teleporters.qh" #include "../common/mapobjects/target/spawnpoint.qh" #include +#include #include "../common/vehicles/all.qh" @@ -232,7 +233,7 @@ void PutObserverInServer(entity this) if (IS_PLAYER(this)) { - if(GetResourceAmount(this, RESOURCE_HEALTH) >= 1) + if(GetResource(this, RES_HEALTH) >= 1) { // despawn effect Send_Effect(EFFECT_SPAWN_NEUTRAL, this.origin, '0 0 0', 1); @@ -311,14 +312,14 @@ void PutObserverInServer(entity this) if(this.damagedbycontents) IL_REMOVE(g_damagedbycontents, this); this.damagedbycontents = false; - SetResourceAmountExplicit(this, RESOURCE_HEALTH, FRAGS_SPECTATOR); + SetResourceExplicit(this, RES_HEALTH, FRAGS_SPECTATOR); SetSpectatee_status(this, etof(this)); this.takedamage = DAMAGE_NO; this.solid = SOLID_NOT; set_movetype(this, MOVETYPE_FLY_WORLDONLY); // user preference is controlled by playerprethink this.flags = FL_CLIENT | FL_NOTARGET; this.effects = 0; - SetResourceAmountExplicit(this, RESOURCE_ARMOR, autocvar_g_balance_armor_start); // was 666?! + SetResourceExplicit(this, RES_ARMOR, autocvar_g_balance_armor_start); // was 666?! this.pauserotarmor_finished = 0; this.pauserothealth_finished = 0; this.pauseregen_finished = 0; @@ -381,7 +382,7 @@ void PutObserverInServer(entity this) if(axh.owner == this && axh != NULL && !wasfreed(axh)) delete(axh); } - + if (mutator_returnvalue) { // mutator prevents resetting teams+score @@ -390,7 +391,9 @@ void PutObserverInServer(entity this) { SetPlayerTeam(this, -1, TEAM_CHANGE_SPECTATOR); this.frags = FRAGS_SPECTATOR; - } + } + if (CS(this).just_joined) + CS(this).just_joined = false; } int player_getspecies(entity this) @@ -555,24 +558,24 @@ void PutPlayerInServer(entity this) this.effects = EF_TELEPORT_BIT | EF_RESTARTANIM_BIT; if (warmup_stage) { - SetResourceAmount(this, RESOURCE_SHELLS, warmup_start_ammo_shells); - SetResourceAmount(this, RESOURCE_BULLETS, warmup_start_ammo_nails); - SetResourceAmount(this, RESOURCE_ROCKETS, warmup_start_ammo_rockets); - SetResourceAmount(this, RESOURCE_CELLS, warmup_start_ammo_cells); - SetResourceAmount(this, RESOURCE_PLASMA, warmup_start_ammo_plasma); - SetResourceAmount(this, RESOURCE_FUEL, warmup_start_ammo_fuel); - SetResourceAmount(this, RESOURCE_HEALTH, warmup_start_health); - SetResourceAmount(this, RESOURCE_ARMOR, warmup_start_armorvalue); + SetResource(this, RES_SHELLS, warmup_start_ammo_shells); + SetResource(this, RES_BULLETS, warmup_start_ammo_nails); + SetResource(this, RES_ROCKETS, warmup_start_ammo_rockets); + SetResource(this, RES_CELLS, warmup_start_ammo_cells); + SetResource(this, RES_PLASMA, warmup_start_ammo_plasma); + SetResource(this, RES_FUEL, warmup_start_ammo_fuel); + SetResource(this, RES_HEALTH, warmup_start_health); + SetResource(this, RES_ARMOR, warmup_start_armorvalue); STAT(WEAPONS, this) = WARMUP_START_WEAPONS; } else { - SetResourceAmount(this, RESOURCE_SHELLS, start_ammo_shells); - SetResourceAmount(this, RESOURCE_BULLETS, start_ammo_nails); - SetResourceAmount(this, RESOURCE_ROCKETS, start_ammo_rockets); - SetResourceAmount(this, RESOURCE_CELLS, start_ammo_cells); - SetResourceAmount(this, RESOURCE_PLASMA, start_ammo_plasma); - SetResourceAmount(this, RESOURCE_FUEL, start_ammo_fuel); - SetResourceAmount(this, RESOURCE_HEALTH, start_health); - SetResourceAmount(this, RESOURCE_ARMOR, start_armorvalue); + SetResource(this, RES_SHELLS, start_ammo_shells); + SetResource(this, RES_BULLETS, start_ammo_nails); + SetResource(this, RES_ROCKETS, start_ammo_rockets); + SetResource(this, RES_CELLS, start_ammo_cells); + SetResource(this, RES_PLASMA, start_ammo_plasma); + SetResource(this, RES_FUEL, start_ammo_fuel); + SetResource(this, RES_HEALTH, start_health); + SetResource(this, RES_ARMOR, start_armorvalue); STAT(WEAPONS, this) = start_weapons; if (MUTATOR_CALLHOOK(ForbidRandomStartWeapons, this) == false) { @@ -602,7 +605,7 @@ void PutPlayerInServer(entity this) this.pauseregen_finished += f; } - this.damageforcescale = 2; + this.damageforcescale = autocvar_g_player_damageforcescale; this.death_time = 0; this.respawn_flags = 0; this.respawn_time = 0; @@ -622,7 +625,10 @@ void PutPlayerInServer(entity this) this.angles = spot.angles; this.angles_z = 0; // never spawn tilted even if the spot says to if (IS_BOT_CLIENT(this)) + { this.v_angle = this.angles; + bot_aim_reset(this); + } this.fixangle = true; // turn this way immediately this.oldvelocity = this.velocity = '0 0 0'; this.avelocity = '0 0 0'; @@ -635,6 +641,10 @@ void PutPlayerInServer(entity this) STAT(REVIVE_PROGRESS, this) = 0; this.revival_time = 0; + // TODO: we can't set these in the PlayerSpawn hook since the target code is called before it! + STAT(BUFFS, this) = 0; + STAT(BUFF_TIME, this) = 0; + this.air_finished = time + 12; this.waterlevel = WATERLEVEL_NONE; this.watertype = CONTENT_EMPTY; @@ -673,6 +683,9 @@ void PutPlayerInServer(entity this) if(this.conveyor) IL_REMOVE(g_conveyed, this); this.conveyor = NULL; // prevent conveyors at the previous location from moving a freshly spawned player + if(this.swampslug) + delete(this.swampslug); + this.in_swamp = false; STAT(HUD, this) = HUD_NORMAL; this.event_damage = PlayerDamage; @@ -730,10 +743,12 @@ void PutPlayerInServer(entity this) }); { - //string s = spot.target; - //spot.target = string_null; + string s = spot.target; + if(g_assault || g_race) // TODO: make targeting work in assault & race without this hack + spot.target = string_null; SUB_UseTargets(spot, this, NULL); - //spot.target = s; + if(g_assault || g_race) + spot.target = s; } Unfreeze(this, false); @@ -1054,6 +1069,8 @@ string getwelcomemessage(entity this) return s; } +bool autocvar_sv_qcphysics = false; // TODO this is for testing - remove when qcphysics work + /** ============= ClientConnect @@ -1146,7 +1163,7 @@ void ClientConnect(entity this) if (IS_REAL_CLIENT(this)) sv_notice_join(this); - this.move_qcphysics = false; + this.move_qcphysics = autocvar_sv_qcphysics; // update physics stats (players can spawn before physics runs) Physics_UpdateStats(this); @@ -1312,12 +1329,14 @@ void respawn(entity this) PutClientInServer(this); } +ERASEABLE void PrintToChat(entity client, string text) { text = strcat("\{1}^7", text, "\n"); sprint(client, text); } +ERASEABLE void DebugPrintToChat(entity client, string text) { if (autocvar_developer) @@ -1326,12 +1345,14 @@ void DebugPrintToChat(entity client, string text) } } +ERASEABLE void PrintToChatAll(string text) { text = strcat("\{1}^7", text, "\n"); bprint(text); } +ERASEABLE void DebugPrintToChatAll(string text) { if (autocvar_developer) @@ -1340,6 +1361,7 @@ void DebugPrintToChatAll(string text) } } +ERASEABLE void PrintToChatTeam(int team_num, string text) { text = strcat("\{1}^7", text, "\n"); @@ -1352,6 +1374,7 @@ void PrintToChatTeam(int team_num, string text) }); } +ERASEABLE void DebugPrintToChatTeam(int team_num, string text) { if (autocvar_developer) @@ -1568,25 +1591,25 @@ void player_regen(entity this) float mina, maxa, limith, limita; maxa = autocvar_g_balance_armor_rotstable; mina = autocvar_g_balance_armor_regenstable; - limith = GetResourceLimit(this, RESOURCE_HEALTH); - limita = GetResourceLimit(this, RESOURCE_ARMOR); + limith = GetResourceLimit(this, RES_HEALTH); + limita = GetResourceLimit(this, RES_ARMOR); regen_health_rotstable = regen_health_rotstable * max_mod; regen_health_stable = regen_health_stable * max_mod; limith = limith * limit_mod; limita = limita * limit_mod; - SetResourceAmount(this, RESOURCE_ARMOR, CalcRotRegen(GetResourceAmount(this, RESOURCE_ARMOR), mina, autocvar_g_balance_armor_regen, autocvar_g_balance_armor_regenlinear, + SetResource(this, RES_ARMOR, CalcRotRegen(GetResource(this, RES_ARMOR), mina, autocvar_g_balance_armor_regen, autocvar_g_balance_armor_regenlinear, regen_mod * frametime * (time > this.pauseregen_finished), maxa, autocvar_g_balance_armor_rot, autocvar_g_balance_armor_rotlinear, rot_mod * frametime * (time > this.pauserotarmor_finished), limita)); - SetResourceAmount(this, RESOURCE_HEALTH, CalcRotRegen(GetResourceAmount(this, RESOURCE_HEALTH), regen_health_stable, regen_health, regen_health_linear, + SetResource(this, RES_HEALTH, CalcRotRegen(GetResource(this, RES_HEALTH), regen_health_stable, regen_health, regen_health_linear, regen_mod * frametime * (time > this.pauseregen_finished), regen_health_rotstable, regen_health_rot, regen_health_rotlinear, rot_mod * frametime * (time > this.pauserothealth_finished), limith)); } // if player rotted to death... die! // check this outside above checks, as player may still be able to rot to death - if(GetResourceAmount(this, RESOURCE_HEALTH) < 1) + if(GetResource(this, RES_HEALTH) < 1) { if(this.vehicle) vehicles_exit(this.vehicle, VHEF_RELEASE); @@ -1600,9 +1623,9 @@ void player_regen(entity this) maxf = autocvar_g_balance_fuel_rotstable; minf = autocvar_g_balance_fuel_regenstable; - limitf = GetResourceLimit(this, RESOURCE_FUEL); + limitf = GetResourceLimit(this, RES_FUEL); - SetResourceAmount(this, RESOURCE_FUEL, CalcRotRegen(GetResourceAmount(this, RESOURCE_FUEL), minf, autocvar_g_balance_fuel_regen, autocvar_g_balance_fuel_regenlinear, + SetResource(this, RES_FUEL, CalcRotRegen(GetResource(this, RES_FUEL), minf, autocvar_g_balance_fuel_regen, autocvar_g_balance_fuel_regenlinear, frametime * (time > this.pauseregen_finished) * ((this.items & ITEM_JetpackRegen.m_itemid) != 0), maxf, autocvar_g_balance_fuel_rot, autocvar_g_balance_fuel_rotlinear, frametime * (time > this.pauserotfuel_finished), limitf)); } @@ -1650,16 +1673,17 @@ void SpectateCopy(entity this, entity spectatee) MUTATOR_CALLHOOK(SpectateCopy, spectatee, this); PS(this) = PS(spectatee); this.armortype = spectatee.armortype; - SetResourceAmountExplicit(this, RESOURCE_ARMOR, GetResourceAmount(spectatee, RESOURCE_ARMOR)); - SetResourceAmountExplicit(this, RESOURCE_CELLS, GetResourceAmount(spectatee, RESOURCE_CELLS)); - SetResourceAmountExplicit(this, RESOURCE_PLASMA, GetResourceAmount(spectatee, RESOURCE_PLASMA)); - SetResourceAmountExplicit(this, RESOURCE_SHELLS, GetResourceAmount(spectatee, RESOURCE_SHELLS)); - SetResourceAmountExplicit(this, RESOURCE_BULLETS, GetResourceAmount(spectatee, RESOURCE_BULLETS)); - SetResourceAmountExplicit(this, RESOURCE_ROCKETS, GetResourceAmount(spectatee, RESOURCE_ROCKETS)); - SetResourceAmountExplicit(this, RESOURCE_FUEL, GetResourceAmount(spectatee, RESOURCE_FUEL)); + SetResourceExplicit(this, RES_ARMOR, GetResource(spectatee, RES_ARMOR)); + SetResourceExplicit(this, RES_CELLS, GetResource(spectatee, RES_CELLS)); + SetResourceExplicit(this, RES_PLASMA, GetResource(spectatee, RES_PLASMA)); + SetResourceExplicit(this, RES_SHELLS, GetResource(spectatee, RES_SHELLS)); + SetResourceExplicit(this, RES_BULLETS, GetResource(spectatee, RES_BULLETS)); + SetResourceExplicit(this, RES_ROCKETS, GetResource(spectatee, RES_ROCKETS)); + SetResourceExplicit(this, RES_FUEL, GetResource(spectatee, RES_FUEL)); this.effects = spectatee.effects & EFMASK_CHEAP; // eat performance - SetResourceAmountExplicit(this, RESOURCE_HEALTH, GetResourceAmount(spectatee, RESOURCE_HEALTH)); + SetResourceExplicit(this, RES_HEALTH, GetResource(spectatee, RES_HEALTH)); CS(this).impulse = 0; + this.disableclientprediction = 1; // no need to run prediction on a spectator this.items = spectatee.items; STAT(LAST_PICKUP, this) = STAT(LAST_PICKUP, spectatee); STAT(HIT_TIME, this) = STAT(HIT_TIME, spectatee); @@ -2029,12 +2053,21 @@ void PrintWelcomeMessage(entity this) { if(PHYS_INPUT_BUTTON_INFO(this)) // BUTTON_INFO hides initial MOTD CS(this).motd_actived_time = -2; // wait until BUTTON_INFO gets released - else if(CS(this).motd_actived_time == -2 || IS_PLAYER(this) || IS_SPEC(this)) + else if (CS(this).motd_actived_time == -2) { - // instanctly hide MOTD + // instantly hide MOTD CS(this).motd_actived_time = 0; Kill_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, CPID_MOTD); } + else if (IS_PLAYER(this) || IS_SPEC(this)) + { + // FIXME occasionally for some reason MOTD never goes away + // delay MOTD removal a little bit in the hope it fixes this bug + if (CS(this).motd_actived_time == -1) // MOTD marked to fade away as soon as client becomes player or spectator + CS(this).motd_actived_time = -(5 + floor(random() * 10)); // add small delay + else //if (CS(this).motd_actived_time < -2) + CS(this).motd_actived_time++; + } } } @@ -2162,11 +2195,13 @@ bool PlayerThink(entity this) for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) { .entity weaponentity = weaponentities[slot]; + if(WEP_CVAR(vortex, charge_always)) + W_Vortex_Charge(this, weaponentity, frametime); W_WeaponFrame(this, weaponentity); } this.items_added = 0; - if ((this.items & ITEM_Jetpack.m_itemid) && ((this.items & ITEM_JetpackRegen.m_itemid) || GetResourceAmount(this, RESOURCE_FUEL) >= 0.01)) + if ((this.items & ITEM_Jetpack.m_itemid) && ((this.items & ITEM_JetpackRegen.m_itemid) || GetResource(this, RES_FUEL) >= 0.01)) this.items_added |= IT_FUEL; this.items |= this.items_added; @@ -2315,19 +2350,15 @@ void PlayerUseKey(entity this) } else if(autocvar_g_vehicles_enter) { - if(!STAT(FROZEN, this)) - if(!IS_DEAD(this)) - if(!game_stopped) + if(!game_stopped && !STAT(FROZEN, this) && !IS_DEAD(this) && !IS_INDEPENDENT_PLAYER(this)) { entity head, closest_target = NULL; head = WarpZone_FindRadius(this.origin, autocvar_g_vehicles_enter_radius, true); while(head) // find the closest acceptable target to enter { - if(IS_VEHICLE(head)) - if(!IS_DEAD(head)) + if(IS_VEHICLE(head) && !IS_DEAD(head) && head.takedamage != DAMAGE_NO) if(!head.owner || ((head.vehicle_flags & VHF_MULTISLOT) && SAME_TEAM(head.owner, this))) - if(head.takedamage != DAMAGE_NO) { if(closest_target) { @@ -2381,9 +2412,18 @@ void PlayerPreThink (entity this) if (this.netname == "" || this.netname != CS(this).netname_previous) { bool assume_unchanged = (CS(this).netname_previous == ""); + if (autocvar_sv_name_maxlength > 0 && strlennocol(this.netname) > autocvar_sv_name_maxlength) + { + int new_length = textLengthUpToLength(this.netname, autocvar_sv_name_maxlength, strlennocol); + this.netname = strzone(strcat(substring(this.netname, 0, new_length), "^7")); + sprint(this, sprintf("Warning: your name is longer than %d characters, it has been truncated.\n", autocvar_sv_name_maxlength)); + assume_unchanged = false; + // stuffcmd(this, strcat("name ", this.netname, "\n")); // maybe? + } if (isInvisibleString(this.netname)) { this.netname = strzone(sprintf("Player#%d", this.playerid)); + sprint(this, "Warning: invisible names are not allowed.\n"); assume_unchanged = false; // stuffcmd(this, strcat("name ", this.netname, "\n")); // maybe? } @@ -2422,7 +2462,7 @@ void PlayerPreThink (entity this) if (STAT(FROZEN, this) == FROZEN_TEMP_REVIVING) { STAT(REVIVE_PROGRESS, this) = bound(0, STAT(REVIVE_PROGRESS, this) + frametime * this.revive_speed, 1); - SetResourceAmountExplicit(this, RESOURCE_HEALTH, max(1, STAT(REVIVE_PROGRESS, this) * start_health)); + SetResourceExplicit(this, RES_HEALTH, max(1, STAT(REVIVE_PROGRESS, this) * start_health)); this.iceblock.alpha = bound(0.2, 1 - STAT(REVIVE_PROGRESS, this), 1); if (STAT(REVIVE_PROGRESS, this) >= 1) @@ -2431,9 +2471,9 @@ void PlayerPreThink (entity this) else if (STAT(FROZEN, this) == FROZEN_TEMP_DYING) { STAT(REVIVE_PROGRESS, this) = bound(0, STAT(REVIVE_PROGRESS, this) - frametime * this.revive_speed, 1); - SetResourceAmountExplicit(this, RESOURCE_HEALTH, max(0, autocvar_g_nades_ice_health + (start_health-autocvar_g_nades_ice_health) * STAT(REVIVE_PROGRESS, this))); + SetResourceExplicit(this, RES_HEALTH, max(0, autocvar_g_nades_ice_health + (start_health-autocvar_g_nades_ice_health) * STAT(REVIVE_PROGRESS, this))); - if (GetResourceAmount(this, RESOURCE_HEALTH) < 1) + if (GetResource(this, RES_HEALTH) < 1) { if (this.vehicle) vehicles_exit(this.vehicle, VHEF_RELEASE); @@ -2448,22 +2488,21 @@ void PlayerPreThink (entity this) MUTATOR_CALLHOOK(PlayerPreThink, this); if(autocvar_g_vehicles_enter && (time > this.last_vehiclecheck) && !game_stopped && !this.vehicle) - if(IS_PLAYER(this) && !STAT(FROZEN, this) && !IS_DEAD(this)) + if(IS_PLAYER(this) && !STAT(FROZEN, this) && !IS_DEAD(this) && !IS_INDEPENDENT_PLAYER(this)) { - FOREACH_ENTITY_RADIUS(this.origin, autocvar_g_vehicles_enter_radius, IS_VEHICLE(it), + FOREACH_ENTITY_RADIUS(this.origin, autocvar_g_vehicles_enter_radius, IS_VEHICLE(it) && !IS_DEAD(it) && it.takedamage != DAMAGE_NO, { - if(!IS_DEAD(it) && it.takedamage != DAMAGE_NO) - if((it.vehicle_flags & VHF_MULTISLOT) && SAME_TEAM(it.owner, this)) - { - Send_Notification(NOTIF_ONE, this, MSG_CENTER, CENTER_VEHICLE_ENTER_GUNNER); - } - else if(!it.owner) + if(!it.owner) { if(!it.team || SAME_TEAM(this, it)) Send_Notification(NOTIF_ONE, this, MSG_CENTER, CENTER_VEHICLE_ENTER); else if(autocvar_g_vehicles_steal) Send_Notification(NOTIF_ONE, this, MSG_CENTER, CENTER_VEHICLE_ENTER_STEAL); } + else if((it.vehicle_flags & VHF_MULTISLOT) && SAME_TEAM(it.owner, this)) + { + Send_Notification(NOTIF_ONE, this, MSG_CENTER, CENTER_VEHICLE_ENTER_GUNNER); + } }); this.last_vehiclecheck = time + 1; @@ -2675,9 +2714,9 @@ void PlayerPostThink (entity this) } if (this.waypointsprite_attachedforcarrier) { - vector v = healtharmor_maxdamage(GetResourceAmount(this, RESOURCE_HEALTH), GetResourceAmount(this, RESOURCE_ARMOR), autocvar_g_balance_armor_blockpercent, DEATH_WEAPON.m_id); - WaypointSprite_UpdateHealth(this.waypointsprite_attachedforcarrier, '1 0 0' * v); - } + float hp = healtharmor_maxdamage(GetResource(this, RES_HEALTH), GetResource(this, RES_ARMOR), autocvar_g_balance_armor_blockpercent, DEATH_WEAPON.m_id).x; + WaypointSprite_UpdateHealth(this.waypointsprite_attachedforcarrier, hp); + } CSQCMODEL_AUTOUPDATE(this); } @@ -2708,9 +2747,6 @@ int Say(entity source, int teamsay, entity privatesay, string msgin, bool floodc teamsay = false; } - if(game_stopped) - teamsay = false; - if (!source) { colorstr = ""; teamsay = false; @@ -2741,6 +2777,24 @@ int Say(entity source, int teamsay, entity privatesay, string msgin, bool floodc int privatemsgprefixlen = 0; if (msgin != "") { + bool found_me = false; + if(strstrofs(msgin, "/me", 0) >= 0) + { + string newmsgin = ""; + string newnamestr = ((teamsay) ? strcat(colorstr, "(", colorprefix, namestr, colorstr, ")", "^7") : strcat(colorprefix, namestr, "^7")); + FOREACH_WORD(msgin, true, + { + if(strdecolorize(it) == "/me") + { + found_me = true; + newmsgin = cons(newmsgin, newnamestr); + } + else + newmsgin = cons(newmsgin, it); + }); + msgin = newmsgin; + } + if(privatesay) { msgstr = strcat("\{1}\{13}* ", colorprefix, namestr, "^3 tells you: ^7"); @@ -2751,11 +2805,11 @@ int Say(entity source, int teamsay, entity privatesay, string msgin, bool floodc } else if(teamsay) { - if(strstrofs(msgin, "/me", 0) >= 0) + if(found_me) { //msgin = strreplace("/me", "", msgin); //msgin = substring(msgin, 3, strlen(msgin)); - msgin = strreplace("/me", strcat(colorstr, "(", colorprefix, namestr, colorstr, ")^7"), msgin); + //msgin = strreplace("/me", strcat(colorstr, "(", colorprefix, namestr, colorstr, ")^7"), msgin); msgstr = strcat("\{1}\{13}^4* ", "^7", msgin); } else @@ -2764,12 +2818,12 @@ int Say(entity source, int teamsay, entity privatesay, string msgin, bool floodc } else { - if(strstrofs(msgin, "/me", 0) >= 0) + if(found_me) { //msgin = strreplace("/me", "", msgin); //msgin = substring(msgin, 3, strlen(msgin)); - msgin = strreplace("/me", strcat(colorprefix, namestr), msgin); - msgstr = strcat("\{1}^4* ", "^7", msgin); + //msgin = strreplace("/me", strcat(colorprefix, namestr), msgin); + msgstr = strcat("\{1}^4* ^7", msgin); } else { msgstr = "\{1}"; @@ -2924,6 +2978,8 @@ int Say(entity source, int teamsay, entity privatesay, string msgin, bool floodc MUTATOR_CALLHOOK(ChatMessage, source, ret); ret = M_ARGV(1, int); + string event_log_msg = ""; + if(sourcemsgstr != "" && ret != 0) { if(ret < 0) // faked message, because the player is muted @@ -2950,6 +3006,8 @@ int Say(entity source, int teamsay, entity privatesay, string msgin, bool floodc FOREACH_CLIENT(IS_REAL_CLIENT(it) && it != source && CS(it).active_minigame == CS(source).active_minigame && !MUTATOR_CALLHOOK(ChatMessageTo, it, source), { sprint(it, msgstr); }); + event_log_msg = sprintf(":chat_minigame:%d:%s:%s", source.playerid, CS(source).active_minigame.netname, msgin); + } else if(teamsay > 0) // team message, only sent to team mates { @@ -2962,6 +3020,7 @@ int Say(entity source, int teamsay, entity privatesay, string msgin, bool floodc if(cmsgstr != "") centerprint(it, cmsgstr); }); + event_log_msg = sprintf(":chat_team:%d:%d:%s", source.playerid, source.team, strreplace("\n", " ", msgin)); } else if(teamsay < 0) // spectator message, only sent to spectators { @@ -2970,6 +3029,7 @@ int Say(entity source, int teamsay, entity privatesay, string msgin, bool floodc FOREACH_CLIENT(!(IS_PLAYER(it) || it.caplayer) && IS_REAL_CLIENT(it) && it != source && !MUTATOR_CALLHOOK(ChatMessageTo, it, source), { sprint(it, msgstr); }); + event_log_msg = sprintf(":chat_spec:%d:%s", source.playerid, strreplace("\n", " ", msgin)); } else { @@ -2981,9 +3041,14 @@ int Say(entity source, int teamsay, entity privatesay, string msgin, bool floodc FOREACH_CLIENT(IS_REAL_CLIENT(it) && it != source && !MUTATOR_CALLHOOK(ChatMessageTo, it, source), { sprint(it, msgstr); }); + event_log_msg = sprintf(":chat:%d:%s", source.playerid, strreplace("\n", " ", msgin)); } } + if (autocvar_sv_eventlog && (event_log_msg != "")) { + GameLogEcho(event_log_msg); + } + return ret; } @@ -2994,7 +3059,7 @@ void PM_UpdateButtons(entity this, entity store) store.impulse = this.impulse; this.impulse = 0; - bool typing = this.buttonchat || this.button14; + bool typing = this.buttonchat || this.button12; store.button0 = (typing) ? 0 : this.button0; //button1?!