diff --git a/addons/sourcemod/configs/szf/classes.cfg b/addons/sourcemod/configs/szf/classes.cfg index 6b75f791..0d0da28f 100644 --- a/addons/sourcemod/configs/szf/classes.cfg +++ b/addons/sourcemod/configs/szf/classes.cfg @@ -46,7 +46,6 @@ "scout" { - "health" "25" "ammo" "2" "menu" "Menu_ClassesSurvivorsScout" } @@ -75,6 +74,7 @@ "engineer" { + "health" "25" "menu" "Menu_ClassesSurvivorsEngineer" } diff --git a/addons/sourcemod/configs/szf/weapons.cfg b/addons/sourcemod/configs/szf/weapons.cfg index 010e85c9..39bfaefe 100644 --- a/addons/sourcemod/configs/szf/weapons.cfg +++ b/addons/sourcemod/configs/szf/weapons.cfg @@ -56,7 +56,7 @@ "220" // Shortstop { - "rarity" "uncommon" + "rarity" "rare" "model" "models/weapons/c_models/c_shortstop/c_shortstop.mdl" } @@ -68,7 +68,7 @@ "772" // Baby Face's Blaster { - "rarity" "rare" + "rarity" "uncommon" "model" "models/weapons/c_models/c_pep_scattergun.mdl" } @@ -105,7 +105,7 @@ "449" // Winger { - "rarity" "common" + "rarity" "uncommon" "model" "models/weapons/c_models/c_winger_pistol/c_winger_pistol.mdl" } @@ -117,7 +117,7 @@ "812" // Flying Guillotine { - "rarity" "uncommon" + "rarity" "common" "model" "models/weapons/c_models/c_sd_cleaver/c_sd_cleaver.mdl" } @@ -328,7 +328,7 @@ "1099" // Tide Turner { - "rarity" "common" + "rarity" "uncommon" "model" "models/workshop/weapons/c_models/c_wheel_shield/c_wheel_shield.mdl" "origin_offset" "0.0 0.0 4.0" "angles_offset" "0.0 0.0 -90.0" @@ -378,7 +378,7 @@ "159" // Dalokohs Bar { - "rarity" "common" + "rarity" "uncommon" "model" "models/weapons/c_models/c_chocolate/c_chocolate.mdl" "angles_offset" "0.0 0.0 -90.0" } @@ -398,7 +398,7 @@ "1190" // Second Banana { - "rarity" "uncommon" + "rarity" "common" "model" "models/weapons/c_models/c_banana/c_banana.mdl" "angles_offset" "0.0 0.0 -90.0" } @@ -609,13 +609,13 @@ "735" // Sapper { - "rarity" "uncommon" + "rarity" "common" "model" "models/weapons/c_models/c_sapper/c_sapper.mdl" } "810" // Red-Tape Recorder { - "rarity" "uncommon" + "rarity" "common" "model" "models/weapons/w_models/w_sd_sapper.mdl" } @@ -766,6 +766,15 @@ "text" "Melee_FistsofSteel" "attrib" "206 ; 0.9" } + "426" //Eviction Notice + { + "text" "Melee_EvictionNotice" + "attrib" "855 ; 0.0 ; 414 ; 1.0" + } + "142" //Gunslinger + { + "attrib" "26 ; 0.0" + } "589" //Eureka Effect { "text" "Melee_EurekaEffect" @@ -788,7 +797,7 @@ "304" //Amputator { "text" "Melee_Amputator" - "attrib" "200 ; 0.0 ; 57 ; 2.0" + "attrib" "200 ; 0.0" } "171" //Tribalman's Shiv { diff --git a/addons/sourcemod/gamedata/szf.txt b/addons/sourcemod/gamedata/szf.txt index dc8b7121..aa18c086 100644 --- a/addons/sourcemod/gamedata/szf.txt +++ b/addons/sourcemod/gamedata/szf.txt @@ -64,38 +64,38 @@ } "CBaseEntity::GetVelocity" { - "linux" "147" - "windows" "146" + "linux" "148" + "windows" "147" } "CBaseEntity::GetDefaultItemChargeMeterValue" { - "linux" "197" - "windows" "196" + "linux" "198" + "windows" "197" } "CTFPlayer::GiveNamedItem" { - "linux" "493" - "windows" "486" + "linux" "494" + "windows" "487" } "CObjectDispenser::RefillThink" { - "linux" "419" - "windows" "405" + "linux" "420" + "windows" "406" } "CObjectDispenser::DispenseAmmo" { - "linux" "424" - "windows" "410" + "linux" "425" + "windows" "411" } "CObjectDispenser::GetHealRate" { - "linux" "428" - "windows" "414" + "linux" "429" + "windows" "415" } "CTFJar::TossJarThink" { - "linux" "498" - "windows" "491" + "linux" "501" + "windows" "494" } "CEconItemView::m_iItemDefinitionIndex" { diff --git a/addons/sourcemod/scripting/superzombiefortress.sp b/addons/sourcemod/scripting/superzombiefortress.sp index a2adf93b..2e0aaf11 100644 --- a/addons/sourcemod/scripting/superzombiefortress.sp +++ b/addons/sourcemod/scripting/superzombiefortress.sp @@ -19,7 +19,7 @@ #include "include/superzombiefortress.inc" -#define PLUGIN_VERSION "4.7.0" +#define PLUGIN_VERSION "4.7.2" #define PLUGIN_VERSION_REVISION "manual" #define MAX_CONTROL_POINTS 8 @@ -345,6 +345,13 @@ char g_sInfectedNames[view_as(Infected_Count)][] = { "Jockey", }; +#define SPITTER_SPIT_MODEL "models/weapons/w_bugbait.mdl" + +char g_sSpitterParticles[][] = { + "unusual_risingstar_green_glow", + "unusual_meteor_fireball_small_green", +}; + Cookie g_cFirstTimeSurvivor; Cookie g_cFirstTimeZombie; Cookie g_cSoundPreference; @@ -385,6 +392,9 @@ Handle g_hTimerProgress; ConVar g_cvForceOn; ConVar g_cvDebug; ConVar g_cvRatio; +ConVar g_cvScaleProgress; +ConVar g_cvScaleSurvivors; +ConVar g_cvScaleLastCP; ConVar g_cvWeaponSpawnReappear; ConVar g_cvWeaponPickupChance; ConVar g_cvWeaponRareChance; @@ -417,6 +427,7 @@ enum struct ConVarEvent ConVar cvSurvivorDeathInterval; // Seconds interval to consider for survivor deaths ConVar cvSurvivorDeathThreshold; // Min threshold for % of survivors died within interval ConVar cvKillSpree; // Killing spree requirement since last survivor death, multiplied by % of zombies in playerbase + ConVar cvProgress; // Min % of playerbase being survivor to trigger by map progress ConVar cvChance; // % Chance to randomly trigger it float flCooldown; @@ -470,13 +481,28 @@ enum struct ConVarEvent // Check if there too many zombie kills since last survivor death - float flPercentage = float(iZombies) / float(iSurvivors + iZombies); - if (g_iZombiesKilledSpree >= this.cvKillSpree.FloatValue * flPercentage) + float flZombiePercentage = float(iZombies) / float(iSurvivors + iZombies); + if (g_iZombiesKilledSpree >= this.cvKillSpree.FloatValue * flZombiePercentage) { - CPrintToChatDebug("Triggered event from killing spree (%d killed >= threshold %.2f)", g_iZombiesKilledSpree, this.cvKillSpree.FloatValue * flPercentage); + CPrintToChatDebug("Triggered event from killing spree (%d killed >= threshold %.2f)", g_iZombiesKilledSpree, this.cvKillSpree.FloatValue * flZombiePercentage); return true; } + // Check if there too many survivors and map has progressed fast (flMinPercentage from 1.0 to flMinCooldown) + float flProgress = GetMapProgress(); + if (0.0 <= flProgress <= 1.0) + { + float flMinCooldown = this.cvProgress.FloatValue; + float flMinPercentage = 1.0 - (flProgress * (1.0 - flMinCooldown)); + + float flSurvivorPercentage = 1.0 - flZombiePercentage; + if (flSurvivorPercentage >= flMinPercentage) + { + CPrintToChatDebug("Triggered event from too many survivors (%.2f >= threshold %.2f)", flSurvivorPercentage, flMinPercentage); + return true; + } + } + return false; } } @@ -1369,15 +1395,24 @@ void SZFEnable() DetermineControlPoints(); PrecacheZombieSouls(); + // Generic Rage PrecacheParticle("spell_cast_wheel_blue"); - //Boomer + // Boomer PrecacheParticle("asplode_hoodoo_debris"); PrecacheParticle("asplode_hoodoo_dust"); - //Map pickup + // Spitter + PrecacheModel(SPITTER_SPIT_MODEL); + for (int i = 0; i < sizeof(g_sSpitterParticles); i++) + PrecacheParticle(g_sSpitterParticles[i]); + + // Map pickup PrecacheSound("ui/item_paint_can_pickup.wav"); + // Disable holiday lights from ropes for Smoker tongue + GameRules_SetProp("m_bRopesHolidayLightsAllowed", false); + if (GameRules_GetRoundState() < RoundState_Preround) { g_nRoundState = SZFRoundState_Setup; @@ -1604,12 +1639,56 @@ void UpdateZombieDamageScale() if (iZombies < 1) iZombies = 1; //Division by 0 error - float flProgress = -1.0; + float flProgress = GetMapProgress(); + + //If progress found, calculate add progress to damage scale + if (0.0 <= flProgress <= 1.0) + g_flZombieDamageScale += (flProgress * g_cvScaleProgress.FloatValue); + + //Lower damage scale as there are less survivors + float flSurvivorPercentage = float(iSurvivors) / float(iSurvivors + iZombies); + float flStartingPercentage = g_cvRatio.FloatValue; + float flMinScale = g_cvScaleSurvivors.FloatValue; + g_flZombieDamageScale *= (flSurvivorPercentage + flMinScale) / (flStartingPercentage + flMinScale); + + //Zombie rage increases damage + if (g_bZombieRage) + g_flZombieDamageScale *= 1.15; + + //If the last point is being captured, increase damage scale + if (g_bCapturingLastPoint && !g_bSurvival) + g_flZombieDamageScale *= g_cvScaleLastCP.FloatValue; + + //Post-calculation + if (g_flZombieDamageScale < 0.2) + g_flZombieDamageScale = 0.2; + if (g_flZombieDamageScale > 3.0) + g_flZombieDamageScale = 3.0; + + //Not survival, no rage and no active tank + if (!g_bSurvival && !g_bZombieRage && !ZombiesTankComing() && !ZombiesHaveTank()) + { + if (g_TankEvent.CanDoEvent()) + { + ZombieTank(); + } + else if (g_FrenzyEvent.CanDoEvent()) + { + if (GetRandomFloat(0.0, 1.0) < g_cvFrenzyTankChance.IntValue) + ZombieTank(); + else + ZombieRage(); + } + } +} + +float GetMapProgress() +{ //Check if it been force set if (0.0 <= g_flCapScale <= 1.0) { - flProgress = g_flCapScale; + return g_flCapScale; } else if (g_bSurvival) { @@ -1621,14 +1700,16 @@ void UpdateZombieDamageScale() float flGameTime = GetGameTime(); if (flGameTime > flTimerEndTime) { - flProgress = 1.0; + return 1.0; } else { float flTimeLeft = flTimerEndTime - flGameTime; - flProgress = 1.0 - (flTimeLeft / flTimerInitialLength); + float flProgress = 1.0 - (flTimeLeft / flTimerInitialLength); if (flProgress < 0.0) flProgress = 0.0; + + return flProgress; } } } @@ -1642,6 +1723,7 @@ void UpdateZombieDamageScale() iCurrentCP += g_iControlPointsInfo[i][1]; //If there atleast 1 CP, set progress by amount of CP capped + float flProgress = 0.0; if (iMaxCP > 0) flProgress = float(iCurrentCP) / float(iMaxCP); @@ -1660,49 +1742,11 @@ void UpdateZombieDamageScale() else flProgress = g_flTimeProgress; } + + return flProgress; } - //If progress found, calculate add progress to damage scale - if (0.0 <= flProgress <= 1.0) - g_flZombieDamageScale += flProgress; - - //Lower damage scale as there are less survivors - float flSurvivorPercentage = float(iSurvivors) / float(iSurvivors + iZombies); - g_flZombieDamageScale = (g_flZombieDamageScale * flSurvivorPercentage * 0.6) + 0.5; - - //Zombie rage increases damage - if (g_bZombieRage) - g_flZombieDamageScale *= 1.15; - - //If the last point is being captured, increase damage scale if lower than 100% - if (g_bCapturingLastPoint && g_flZombieDamageScale < 1.0 && !g_bSurvival) - g_flZombieDamageScale += (1.0 - g_flZombieDamageScale) * 0.5; - - //Post-calculation - if (g_flZombieDamageScale < 1.0) - g_flZombieDamageScale = Pow(g_flZombieDamageScale, 3.0); - - if (g_flZombieDamageScale < 0.2) - g_flZombieDamageScale = 0.2; - - if (g_flZombieDamageScale > 3.0) - g_flZombieDamageScale = 3.0; - - //Not survival, no rage and no active tank - if (!g_bSurvival && !g_bZombieRage && !ZombiesTankComing() && !ZombiesHaveTank()) - { - if (g_TankEvent.CanDoEvent()) - { - ZombieTank(); - } - else if (g_FrenzyEvent.CanDoEvent()) - { - if (GetRandomFloat(0.0, 1.0) < g_cvFrenzyTankChance.IntValue) - ZombieTank(); - else - ZombieRage(); - } - } + return -1.0; } public Action Timer_RespawnPlayer(Handle hTimer, int iClient) diff --git a/addons/sourcemod/scripting/szf/convar.sp b/addons/sourcemod/scripting/szf/convar.sp index e195ee3b..64e9cc41 100644 --- a/addons/sourcemod/scripting/szf/convar.sp +++ b/addons/sourcemod/scripting/szf/convar.sp @@ -16,6 +16,9 @@ void ConVar_Init() g_cvForceOn = CreateConVar("sm_szf_force_on", "1", "<0/1> Force enable SZF for next map.", _, true, 0.0, true, 1.0); g_cvDebug = CreateConVar("sm_szf_debug", "0", "Enable debugs?", _, true, 0.0, true, 1.0); g_cvRatio = CreateConVar("sm_szf_ratio", "0.80", "<0.01-1.00> Percentage of players that start as survivors.", _, true, 0.01, true, 1.0); + g_cvScaleProgress = CreateConVar("sm_szf_scale_progress", "0.4", "Max amount of scale to add from map progress.", _, true, 0.0); + g_cvScaleSurvivors = CreateConVar("sm_szf_scale_survivors", "0.1", "Min amount to multiply the scale from % of survivors", _, true, 0.0, true, 1.0); + g_cvScaleLastCP = CreateConVar("sm_szf_scale_lastcp", "1.25", "Scale multiplier to apply when the last control point is being captured", _, true, 0.0); g_cvWeaponSpawnReappear = CreateConVar("sm_szf_weapon_spawn_reappear", "0.25", "% chance for spawn weapons to reappear.", _, true, 0.0, true, 1.0); g_cvWeaponPickupChance = CreateConVar("sm_szf_weapon_pickup_chance", "0.07", "% chance for normal weapons to be pickups.", _, true, 0.0, true, 1.0); g_cvWeaponRareChance = CreateConVar("sm_szf_weapon_rare_chance", "0.2", "% chance for normal weapons to be rare.", _, true, 0.0, true, 1.0); @@ -42,8 +45,9 @@ void ConVar_Init() g_cvMeleeIgnoreTeammates = CreateConVar("sm_szf_melee_ignores_teammates", "1.0", "<0/1> If enabled, melee hits will ignore teammates.", _, true, 0.0, true, 1.0); g_cvPunishAvoidingPlayers = CreateConVar("sm_szf_punish_avoiding_players", "1.0", "<0/1> If enabled, players who avoid playing on the Infected team will be forced back into it in the next round they play.", _, true, 0.0, true, 1.0); - ConVar_InitEvent(g_FrenzyEvent, "frenzy", "60.0", "150.0", "0.1", "50"); - ConVar_InitEvent(g_TankEvent, "tank", "120.0", "240.0", "0.1", "80"); + // syntax cooldown interval threshold killspree progress + ConVar_InitEvent(g_FrenzyEvent, "frenzy", "60.0", "150.0", "0.1", "50", "0.2"); + ConVar_InitEvent(g_TankEvent, "tank", "120.0", "240.0", "0.1", "80", "0.3"); g_aConVar = new ArrayList(sizeof(ConVarInfo)); @@ -62,13 +66,14 @@ void ConVar_Init() ConVar_Add("tf_weapon_criticals", 0.0); } -void ConVar_InitEvent(ConVarEvent event, const char[] sSyntax, const char[] sCooldown, const char[] sInterval, const char[] sThreshold, const char[] sKillSpree) +void ConVar_InitEvent(ConVarEvent event, const char[] sSyntax, const char[] sCooldown, const char[] sInterval, const char[] sThreshold, const char[] sKillSpree, const char[] sProgress) { event.cvCooldown = CreateConVar(ConVar_FormatString(sSyntax, "sm_szf_%s_cooldown"), sCooldown, ConVar_FormatString(sSyntax, "Cooldown in seconds for %s."), _, true, 0.0); event.cvSurvivorDeathInterval = CreateConVar(ConVar_FormatString(sSyntax, "sm_szf_%s_survivor_death_interval"), sInterval, ConVar_FormatString(sSyntax, "Check in the past seconds on how many survivors died to trigger %s."), _, true, 0.0); event.cvSurvivorDeathThreshold = CreateConVar(ConVar_FormatString(sSyntax, "sm_szf_%s_survivor_death_threshold"), sThreshold, ConVar_FormatString(sSyntax, "Min %% amount of survivors who have died in the past seconds to trigger %s."), _, true, 0.0, true, 1.0); event.cvKillSpree = CreateConVar(ConVar_FormatString(sSyntax, "sm_szf_%s_killspree"), sKillSpree, ConVar_FormatString(sSyntax, "Amount of infected deaths to trigger %s, multiplied by %% of infecteds."), _, true, 0.0); - event.cvChance = CreateConVar(ConVar_FormatString(sSyntax, "sm_szf_%s_chance"), "0.0", ConVar_FormatString(sSyntax, "%% Chance of a %s frenzy."), _, true, 0.0, true, 1.0); + event.cvProgress = CreateConVar(ConVar_FormatString(sSyntax, "sm_szf_%s_progress"), sProgress, ConVar_FormatString(sSyntax, "Min %% of playerbase being survivor to trigger %s by map progress."), _, true, 0.0, true, 1.0); + event.cvChance = CreateConVar(ConVar_FormatString(sSyntax, "sm_szf_%s_chance"), "0.0", ConVar_FormatString(sSyntax, "%% Chance of a random %s."), _, true, 0.0, true, 1.0); } char[] ConVar_FormatString(const char[] sSyntax, const char[] sName) diff --git a/addons/sourcemod/scripting/szf/pickupweapons.sp b/addons/sourcemod/scripting/szf/pickupweapons.sp index 178edde2..9c480b08 100644 --- a/addons/sourcemod/scripting/szf/pickupweapons.sp +++ b/addons/sourcemod/scripting/szf/pickupweapons.sp @@ -203,6 +203,7 @@ void SetUniqueWeapon(int iEntity, ArrayList &aWeapons, WeaponRarity iWepRarity) { // No more unique weapons to pick, delete it RemoveEntity(iEntity); + return; } if (nClassFilter == TFClass_Unknown) diff --git a/addons/sourcemod/scripting/szf/sdkhook.sp b/addons/sourcemod/scripting/szf/sdkhook.sp index 78424e26..ce97af6d 100644 --- a/addons/sourcemod/scripting/szf/sdkhook.sp +++ b/addons/sourcemod/scripting/szf/sdkhook.sp @@ -12,6 +12,10 @@ void SDKHook_OnEntityCreated(int iEntity, const char[] sClassname) { SDKHook(iEntity, SDKHook_SpawnPost, Pickup_SpawnPost); } + else if (StrEqual(sClassname, "tf_projectile_jar_gas")) + { + SDKHook(iEntity, SDKHook_SpawnPost, GasProjectile_SpawnPost); + } else if (StrEqual(sClassname, "tf_gas_manager")) { SDKHook(iEntity, SDKHook_Touch, GasManager_Touch); @@ -366,6 +370,21 @@ public Action Pickup_BananaTouch(int iEntity, int iToucher) return Plugin_Continue; } +public void GasProjectile_SpawnPost(int iGasProjectile) +{ + int iOwner = GetEntPropEnt(iGasProjectile, Prop_Send, "m_hOwnerEntity"); + if (!IsValidZombie(iOwner)) + return; + + SetEntityRenderMode(iGasProjectile, RENDER_TRANSCOLOR); + SetEntityRenderColor(iGasProjectile, 0, 255, 0, 255); + SetEntPropFloat(iGasProjectile, Prop_Send, "m_flModelScale", 1.5); + + SetEntityModel(iGasProjectile, SPITTER_SPIT_MODEL); + for (int i = 0; i < sizeof(g_sSpitterParticles); i++) + AttachParticle(iGasProjectile, g_sSpitterParticles[i]); +} + public Action GasManager_Touch(int iGasManager, int iClient) { if (IsValidSurvivor(iClient)) diff --git a/addons/sourcemod/scripting/szf/stocks.sp b/addons/sourcemod/scripting/szf/stocks.sp index 8f85ea5e..01588ec0 100644 --- a/addons/sourcemod/scripting/szf/stocks.sp +++ b/addons/sourcemod/scripting/szf/stocks.sp @@ -339,7 +339,7 @@ stock bool IsValidLivingZombie(int iClient) stock bool IsMapSZF() { - char sMap[8]; + char sMap[PLATFORM_MAX_PATH]; GetCurrentMap(sMap, sizeof(sMap)); GetMapDisplayName(sMap, sMap, sizeof(sMap)); @@ -1068,7 +1068,7 @@ bool Trace_DontHitTeammates(int iEntity, int iMask, any iData) // Particles //////////////// -stock int ShowParticle(char[] sParticle, float flDuration, float vecPos[3], float vecAngles[3] = NULL_VECTOR) +stock int ShowParticle(const char[] sParticle, float flDuration, float vecPos[3], float vecAngles[3] = NULL_VECTOR) { int iParticle = CreateEntityByName("info_particle_system"); if (IsValidEdict(iParticle)) @@ -1088,6 +1088,44 @@ stock int ShowParticle(char[] sParticle, float flDuration, float vecPos[3], floa return iParticle; } +stock void AttachParticle(int iEntity, const char[] sParticle) +{ + // find string table + int iTable = FindStringTable("ParticleEffectNames"); + if (iTable == INVALID_STRING_TABLE) + return; + + // find particle index + char sBuffer[256]; + int iCount = GetStringTableNumStrings(iTable); + int iIndex = INVALID_STRING_INDEX; + for (int i; i < iCount; i++) + { + ReadStringTable(iTable, i, sBuffer, sizeof(sBuffer)); + if (StrEqual(sBuffer, sParticle, false)) + { + iIndex = i; + break; + } + } + + if (iIndex == INVALID_STRING_INDEX) + return; + + TE_Start("TFParticleEffect"); + TE_WriteFloat("m_vecOrigin[0]", 100000.0); + TE_WriteFloat("m_vecOrigin[1]", 100000.0); + TE_WriteFloat("m_vecOrigin[2]", 100000.0); + TE_WriteNum("m_iParticleSystemIndex", iIndex); + + TE_WriteNum("entindex", iEntity); + TE_WriteNum("m_iAttachType", -1); + TE_WriteNum("m_iAttachmentPointIndex", 6); + TE_WriteNum("m_bResetParticles", false); + + TE_SendToAll(0.0); +} + stock void PrecacheParticle(char[] sParticleName) { if (IsValidEntity(0)) diff --git a/addons/sourcemod/translations/chi/superzombiefortress.phrases.txt b/addons/sourcemod/translations/chi/superzombiefortress.phrases.txt index bd2f51b4..820bb02f 100644 --- a/addons/sourcemod/translations/chi/superzombiefortress.phrases.txt +++ b/addons/sourcemod/translations/chi/superzombiefortress.phrases.txt @@ -74,6 +74,16 @@ { "chi" "{1}你死亡并变成了感染者..." } + + "Infected_ForceStart_LastRound" + { + "chi" "{1}由于您避免参加上一轮游戏,您已被强制设置为感染者队伍。" + } + + "Infected_ForceStart" + { + "chi" "{1}您已被强制设置为感染者队伍,因为您在{2}、{3}时尝试避免游戏。" + } "Infected_RageReady" { @@ -260,10 +270,15 @@ { "chi" "{1}幸存者不能在回合中切换兵种" } + + "SpecialInfected_Tank" + { + "chi" "{green}你是TANK:\n{orange}- 一股几乎势不可挡的力量。\n- 呼叫'医生!'捡起碎石往前方投掷,伤害沿途的所有人!{yellow}(5 秒冷却)" + } "SpecialInfected_Boomer" { - "chi" "{green}你变成了BOOMER:\n{orange}- 呼叫'医生!'来自爆并让周围敌人被尿包围!\n- 你也会在死后爆炸,让击杀者和助攻者被尿包围。" + "chi" "{green}你是BOOMER:\n{orange}- 呼叫'医生!'来自爆并让周围敌人被尿包围!\n- 你也会在死后爆炸,让击杀者和助攻者被尿包围。" } "SpecialInfected_Charger" @@ -273,7 +288,7 @@ "SpecialInfected_Screamer" { - "chi" "你是SCREAMER:\n{orange}- 呼叫'医生!'来强化队友感染者!{yellow}(20秒冷却){orange}\n- 靠近你的感染者会变强。" + "chi" "{green}你是SCREAMER:\n{orange}- 呼叫'医生!'来强化队友感染者!{yellow}(20秒冷却){orange}\n- 靠近你的感染者会变强。" } "SpecialInfected_Stalker" @@ -286,9 +301,14 @@ "chi" "{green}你是HUNTER:\n{orange}- 呼叫'医生!'来进行飞扑感染者!{yellow}(未命中5秒冷却 & 命中20秒冷却)" } + "SpecialInfected_Smoker" + { + "chi" "{green}你是SMOKER:\n{orange}- 右键发射一道光束拉扯敌人靠近你!{yellow}(没有冷却)" + } + "SpecialInfected_Spitter" { - "chi" "{green}你是SPITTER:\N{orange}- 呼叫'医生!'来投掷你的毒气到幸存者中造成伤害!{yellow}(15秒冷却)" + "chi" "{green}你是SPITTER:\n{orange}- 呼叫'医生!'来投掷你的毒气到幸存者中造成伤害!{yellow}(15秒冷却)" } "SpecialInfected_Jockey" @@ -310,11 +330,21 @@ { "chi" "{orange}钉棍{red}使你受到额外10%%的伤害。" } + + "Melee_HalfZatochi" + { + "chi" "{orange}座头市之刀{red}使你击杀后恢复15%%生命值。" + } "Melee_MarketGardener" { "chi" "{orange}市场花园铁铲{green}让你火箭跳高度增加25%%。" } + + "Melee_ThirdDegree" + { + "chi" "{orange}三度烧伤{green}在你被治疗的时候造成30%%额外伤害。" + } "Melee_Eyelander" { @@ -432,7 +462,7 @@ "Menu_ClassesSurvivorsScout" { - "chi" "有额外25生命值。\n击杀后获得2主武器弹药,可以超过最大值。" + "chi" "击杀后获得2主武器弹药,可以超过最大值。" } "Menu_ClassesSurvivorsSoldier" @@ -442,7 +472,7 @@ "Menu_ClassesSurvivorsPyro" { - "chi" "燃烧僵尸移动更快。\n火焰喷射器弹药限制在100." + "chi" "火焰喷射器弹药限制在150." } "Menu_ClassesSurvivorsDemoman" @@ -452,12 +482,7 @@ "Menu_ClassesSurvivorsHeavy" { - "chi" "转轮机枪弹药限制为100." - } - - "Menu_ClassesSurvivorsEngineer" - { - "chi" "以PDA开局。\n只可以建造步哨和补给器,不能升级。\n步哨枪弹药有限制,随时间消耗并且不可以补充。\n补给器充当墙的角色,有更高的生命值,但是不能补充弹药。" + "chi" "转轮机枪弹药限制为150." } "Menu_ClassesSurvivorsMedic" @@ -465,11 +490,6 @@ "chi" "医疗枪有治疗速率的负面效果。" } - "Menu_ClassesSurvivorsSniper" - { - "chi" "SMG不用重新装填。\n尿瓶使感染者减速。\n有25额外生命值。\n击杀时获得2主武器弹药,可以超过最大值。" - } - "Menu_ClassesSurvivorsSpy" { "chi" "以隐身手表和位置工具开局。\n击杀时获得2主武器弹药,可以超过最大值。" @@ -527,17 +547,17 @@ "Menu_ClassesInfectedSpecialBoomer" { - "chi" "他恶心,脏,很乐意把这些分享给幸存者。\n- 技能是自爆,让敌人被尿包围。\n- 死亡也会爆炸,但是威力和范围会减少。" + "chi" "他既恶心又脏,并且很乐意把这些分享给幸存者。\n- 技能是自爆,让敌人被尿包围。\n- 死亡也会爆炸,但是威力和范围会减少。" } "Menu_ClassesInfectedSpecialCharger" { - "chi" "内在的愤怒让它不顾一切的卡其脱离带,直到撞倒人。\n- 使用愤怒,Charger可以冲锋并且锁定幸存者的移动,推动他穿越区域。" + "chi" "内在的愤怒让它不顾一切的冲锋,直到撞倒人。\n- 使用愤怒,Charger可以冲锋并且锁定幸存者的移动,推动他穿越区域。" } "Menu_ClassesInfectedSpecialScreamer" { - "chi" "Screamer是感染者队长,可以让感染者们全副武装攻击幸存者。\n- 使用愤怒,Screamer会用一声刺破耳膜的尖叫声集结感染者,增加感染者的总体能力。\n- Screamer靠近感染者可以强化他们,增加强度。" + "chi" "Screamer是感染者队长,可以让感染者们整装待发来攻击幸存者。\n- 使用愤怒,Screamer会用一声刺破耳膜的尖叫声集结感染者,增加感染者的总体能力。\n- Screamer靠近感染者可以强化他们,增加强度。" } "Menu_ClassesInfectedSpecialStalker" @@ -562,6 +582,66 @@ "Menu_ClassesInfectedSpecialJockey" { - "chi" "Jockey到处爬,寻找幸存者骑上去。\n- 使用愤怒可以让它飞扑,抓住幸存者的头,但与Hunter不同。\n- 可以控制幸存者的头,控制行动。\n- 可以在控制幸存者的同时逐渐造成少量的伤害。" + "chi" "Jockey爬来爬去,寻找幸存者骑上去。\n- 使用愤怒可以让它飞扑,抓住幸存者的头,但与Hunter不同。\n- 可以控制幸存者的头,控制行动。\n- 可以在控制幸存者的同时逐渐造成少量的伤害。" + } + + "Menu_SoundTitle" + { + "chi" "选择声音设置的首选项。" + } + + "Menu_SoundFull" + { + "chi" "全部声音" + } + + "Menu_SoundNoMusic" + { + "chi" "关闭音乐" + } + + "Menu_SoundNoSound" + { + "chi" "关闭音效" + } + + "Menu_SoundNone" + { + "chi" "关闭音乐和音效" + } + + "Menu_SoundSelected" + { + "chi" "{1}{2}{3} 首选项已被选择。" + } + + "Time_MonthsAgo" + { + "chi" "{1} 月前" + } + + "Time_DaysAgo" + { + "chi" "{1} 天前" + } + + "Time_HoursAgo" + { + "chi" "{1} 小时前" + } + + "Time_MinuteAgo" + { + "chi" "一分钟前" + } + + "Time_MinutesAgo" + { + "chi" "{1} 分钟前" + } + + "Time_LessThanAMinuteAgo" + { + "chi" "不到一分钟前" } } \ No newline at end of file diff --git a/addons/sourcemod/translations/hu/superzombiefortress.phrases.txt b/addons/sourcemod/translations/hu/superzombiefortress.phrases.txt index 202ce3e8..0f1c3a7d 100644 --- a/addons/sourcemod/translations/hu/superzombiefortress.phrases.txt +++ b/addons/sourcemod/translations/hu/superzombiefortress.phrases.txt @@ -446,7 +446,7 @@ "Menu_ClassesSurvivorsScout" { - "hu" "25 extra maximális életerővel rendelkezik.\nÖlésenként 2 elsődleges lőszert kap, ez meghaladhatja a fegyver szokásos maximális kapacitását." + "hu" "Ölésenként 2 elsődleges lőszert kap, ez meghaladhatja a fegyver szokásos maximális kapacitását." } "Menu_ClassesSurvivorsSoldier" @@ -456,7 +456,7 @@ "Menu_ClassesSurvivorsPyro" { - "hu" "Az égő zombik gyorsabban mozognak.\nA lángszóró lőszere 100-ra korlátozva." + "hu" "A lángszóró lőszere 150-ra korlátozva." } "Menu_ClassesSurvivorsDemoman" @@ -466,12 +466,7 @@ "Menu_ClassesSurvivorsHeavy" { - "hu" "A gépfegyver lőszere 100-ra korlátozva." - } - - "Menu_ClassesSurvivorsEngineer" - { - "hu" "PDA-kkal kezd.\nCsak őrtornyokat és adagolókat építhet, és nem fejleszthetők.\nAz őrtorony lőszere korlátozott, idővel fogy és nem tölthető újra.\nAz adagolók falként működnek, magasabb életerővel, mint általában, de nem töltenek újra lőszert." + "hu" "A gépfegyver lőszere 150-ra korlátozva." } "Menu_ClassesSurvivorsMedic" @@ -479,11 +474,6 @@ "hu" "A Medigun gyógyítási sebessége csökkentett." } - "Menu_ClassesSurvivorsSniper" - { - "hu" "Az SMG-t nem kell újratölteni.\nA Jarate lelassítja a Fertőzötteket.\n25 extra maximális életerővel rendelkezik.\nÖlésenként 2 elsődleges lőszert kap, ez meghaladhatja a fegyver szokásos maximális kapacitását." - } - "Menu_ClassesSurvivorsSpy" { "hu" "Láthatatlanná tevő órákkal és álcázó készlettel kezd.\nÖlésenként 2 elsődleges lőszert kap, ez meghaladhatja a fegyver szokásos maximális kapacitását." diff --git a/addons/sourcemod/translations/jp/superzombiefortress.phrases.txt b/addons/sourcemod/translations/jp/superzombiefortress.phrases.txt index 59826fc5..fb9b2fdf 100644 --- a/addons/sourcemod/translations/jp/superzombiefortress.phrases.txt +++ b/addons/sourcemod/translations/jp/superzombiefortress.phrases.txt @@ -421,7 +421,7 @@ "Menu_ClassesSurvivorsScout" { - "jp" "最大ヘルスが25追加されます。\nキルごとに最初の武器で2弾薬を獲得し、弾薬容量を超えることができます。" + "jp" "キルごとに最初の武器で2弾薬を獲得し、弾薬容量を超えることができます。" } "Menu_ClassesSurvivorsSoldier" @@ -431,7 +431,7 @@ "Menu_ClassesSurvivorsPyro" { - "jp" "燃えるゾンビはより速く移動します。\n火炎放射器の弾薬数は100に制限されています。" + "jp" "火炎放射器の弾薬数は150に制限されています。" } "Menu_ClassesSurvivorsDemoman" @@ -441,12 +441,7 @@ "Menu_ClassesSurvivorsHeavy" { - "jp" "ミニガンの弾薬数は100に制限されています。" - } - - "Menu_ClassesSurvivorsEngineer" - { - "jp" "PDAで始まります。\nアップグレードできない歩哨とディスペンサーのみを構築できます。\nセントリーの弾薬は限られており、ゆっくりと消え、元に戻すことはできません。\nディスペンサーは壁として機能します。 彼らはより高い健康を持っていますが、弾薬を復元することはできません。" + "jp" "ミニガンの弾薬数は150に制限されています。" } "Menu_ClassesSurvivorsMedic" @@ -454,11 +449,6 @@ "jp" "メディガンには治癒率のペナルティがあります。" } - "Menu_ClassesSurvivorsSniper" - { - "jp" "SMGをリロードする必要はありません。\nジャラテはゾンビを遅くします。\n最大ヘルスが25追加されます。\nキルごとに最初の武器で2弾薬を獲得し、弾薬容量を超えることができます。" - } - "Menu_ClassesSurvivorsSpy" { "jp" "透明ウォッチと変装キットから始まります。\nキルごとに最初の武器で2弾薬を獲得し、弾薬容量を超えることができます" diff --git a/addons/sourcemod/translations/pt/superzombiefortress.phrases.txt b/addons/sourcemod/translations/pt/superzombiefortress.phrases.txt index 90387d29..e30c0dcb 100644 --- a/addons/sourcemod/translations/pt/superzombiefortress.phrases.txt +++ b/addons/sourcemod/translations/pt/superzombiefortress.phrases.txt @@ -442,7 +442,7 @@ "Menu_ClassesSurvivorsScout" { - "pt" "Possui 25 de vida máxima adicional.\nGanha 2 munições primárias por kill, podendo ultrapassar a capacidade máxima usual de sua arma." + "pt" "Ganha 2 munições primárias por kill, podendo ultrapassar a capacidade máxima usual de sua arma." } "Menu_ClassesSurvivorsSoldier" @@ -452,7 +452,7 @@ "Menu_ClassesSurvivorsPyro" { - "pt" "Zumbis em chamas se movem mais rápido.\nA munição do lança-chamas é limitada a 100." + "pt" "A munição do lança-chamas é limitada a 150." } "Menu_ClassesSurvivorsDemoman" @@ -462,12 +462,7 @@ "Menu_ClassesSurvivorsHeavy" { - "pt" "A munição da metralhadora giratória é limitada a 100." - } - - "Menu_ClassesSurvivorsEngineer" - { - "pt" "Começa com PDAs.\nSó pode construir torres e dispensadores, que não podem ser melhorados.\nA munição das torres é limitada, decai e não pode ser reabastecida.\nDispensadores atuam como paredes, com vida maior que o usual, mas sem reabastecimento de munição." + "pt" "A munição da metralhadora giratória é limitada a 150." } "Menu_ClassesSurvivorsMedic" @@ -475,11 +470,6 @@ "pt" "A arma de cura tem uma penalidade na taxa de cura." } - "Menu_ClassesSurvivorsSniper" - { - "pt" "A SMG não precisa recarregar.\nO Jarate reduz a velocidade dos Infectados.\nPossui 25 de vida máxima adicional.\nGanha 2 munições primárias por kill, podendo ultrapassar a capacidade máxima usual de sua arma." - } - "Menu_ClassesSurvivorsSpy" { "pt" "Começa com relógios de invisibilidade e kit de disfarce.\nGanha 2 munições primárias por kill, podendo ultrapassar a capacidade máxima usual de sua arma." diff --git a/addons/sourcemod/translations/ru/superzombiefortress.phrases.txt b/addons/sourcemod/translations/ru/superzombiefortress.phrases.txt index 4eaccbc8..2e777778 100644 --- a/addons/sourcemod/translations/ru/superzombiefortress.phrases.txt +++ b/addons/sourcemod/translations/ru/superzombiefortress.phrases.txt @@ -436,7 +436,7 @@ "Menu_ClassesSurvivorsScout" { - "ru" "Имеет 25 доп. ед. макс. здоровья.\nПолучает 2 коробки боеприпасов для основного оружия за убийство, оно может превышать обычную максимальную ёмкость вашего оружия." + "ru" "Получает 2 коробки боеприпасов для основного оружия за убийство, оно может превышать обычную максимальную ёмкость вашего оружия." } "Menu_ClassesSurvivorsSoldier" @@ -446,7 +446,7 @@ "Menu_ClassesSurvivorsPyro" { - "ru" "Горящие зомби движутся быстрее.\nБоезапас огнемёта ограничен до 100." + "ru" "Боезапас огнемёта ограничен до 150." } "Menu_ClassesSurvivorsDemoman" @@ -456,12 +456,7 @@ "Menu_ClassesSurvivorsHeavy" { - "ru" "Боезапас для пулемёта ограничен до 100." - } - - "Menu_ClassesSurvivorsEngineer" - { - "ru" "Появляется с КПК.\nМожно строить только турели и раздатчики, но они не могут быть улучшены.\nБоеприпасы для турелей ограничены, тратятся и не могут быть пополнены.\nРаздатчики действуют как стены с более высокой прочностью, чем обычно, но не пополняют боеприпасы." + "ru" "Боезапас для пулемёта ограничен до 150." } "Menu_ClassesSurvivorsMedic" @@ -469,11 +464,6 @@ "ru" "Медицинская пушка имеет уменьшенную скорость лечения." } - "Menu_ClassesSurvivorsSniper" - { - "ru" "ПП не требует перезарядки.\nБанкате замедляет заражённых.\nИмеет 25 доп. ед. макс. здоровья.\nПолучает 2 коробки боеприпасов для основного оружия за убийство, оно может превышать обычную максимальную ёмкость вашего оружия." - } - "Menu_ClassesSurvivorsSpy" { "ru" "Появляется с часами невидимости и набором маскировки.\nПолучает 2 коробки боеприпасов для основного оружия за убийство, оно может превышать обычную максимальную емкость вашего оружия." diff --git a/addons/sourcemod/translations/superzombiefortress.phrases.txt b/addons/sourcemod/translations/superzombiefortress.phrases.txt index 7c05d537..15eec253 100644 --- a/addons/sourcemod/translations/superzombiefortress.phrases.txt +++ b/addons/sourcemod/translations/superzombiefortress.phrases.txt @@ -397,6 +397,11 @@ { "en" "{orange}The Fists of Steel {green}gives 10%% melee resistance while active." } + + "Melee_EvictionNotice" + { + "en" "{orange}The Eviction Notice {green}has its health drain disabled. {red}Marked-For-Death while active." + } "Melee_EurekaEffect" { @@ -490,7 +495,7 @@ "Menu_ClassesSurvivorsScout" { - "en" "Has 25 extra max health.\nGains 2 primary ammo per kill, this can go beyond the usual maximum capacity of your weapon." + "en" "Gains 2 primary ammo per kill, this can go beyond the usual maximum capacity of your weapon." } "Menu_ClassesSurvivorsSoldier" @@ -500,7 +505,7 @@ "Menu_ClassesSurvivorsPyro" { - "en" "Burning zombies move faster.\nFlamethrower ammo limited to 100." + "en" "Flamethrower ammo limited to 150." } "Menu_ClassesSurvivorsDemoman" @@ -510,12 +515,12 @@ "Menu_ClassesSurvivorsHeavy" { - "en" "Minigun ammo limited to 100." + "en" "Minigun ammo limited to 150." } "Menu_ClassesSurvivorsEngineer" { - "en" "Starts with PDAs.\nCan only build sentries and dispensers, and cannot be upgraded.\nSentry ammo is limited, decays and cannot be replenished.\nDispensers act as walls, with higher health than usual but no ammo replenishment." + "en" "Has 25 extra max health.\nStarts with PDAs.\nCan only build sentries and dispensers, and cannot be upgraded.\nSentry ammo is limited, decays and cannot be replenished.\nDispensers are minis, decays on health and ammo dispenses." } "Menu_ClassesSurvivorsMedic" @@ -525,7 +530,7 @@ "Menu_ClassesSurvivorsSniper" { - "en" "SMG doesn't have to reload.\nJarate slows down Infected.\nHas 25 extra max health.\nGains 2 primary ammo per kill, this can go beyond the usual maximum capacity of your weapon." + "en" "SMG ammo increased to 125.\nJarate slows down Infected.\nHas 25 extra max health.\nGains 2 primary ammo per kill, this can go beyond the usual maximum capacity of your weapon." } "Menu_ClassesSurvivorsSpy"