diff --git a/addons/sourcemod/configs/szf/classes.cfg b/addons/sourcemod/configs/szf/classes.cfg index e39c5f5e..1b9a6f9e 100644 --- a/addons/sourcemod/configs/szf/classes.cfg +++ b/addons/sourcemod/configs/szf/classes.cfg @@ -22,15 +22,13 @@ // message Description of the special infected. // worldmodel Custom world model to set as. // viewmodel Custom view model to set as. - // viewmodel_angles Viewmodel angles offset to set. - // viewmodel_height Viewmodel height offset to set. + // viewmodel_anim 0 to bonemerge from default viewmodel, 1 to override with custom anims // sound_spawn Sound to play survivors on spawn. // ragecooldown Amount of seconds to use rage again. // callback_spawn Callback to use on spawn. // callback_rage Callback to use on rage. // callback_think Callback to use on every frame. // callback_touch Callback to use when player touches someone - // callback_anim Callback to use on changing player animations. // callback_death Callback to use on death. //Below is for "weapon" @@ -116,8 +114,9 @@ "scout" { - "health" "15" + "health" "15" "menu" "Menu_ClassesInfectedScout" + "viewmodel" "models/kirillian/weapons/c_models/c_scout_arms_zombie.mdl" "weapon" { @@ -134,6 +133,7 @@ "maxspree" "10.0" "maxhorde" "10.0" "menu" "Menu_ClassesInfectedSoldier" + "viewmodel" "models/kirillian/weapons/c_models/c_soldier_arms_zombie.mdl" "weapon" { @@ -150,6 +150,7 @@ "maxspree" "10.0" "maxhorde" "10.0" "menu" "Menu_ClassesInfectedPyro" + "viewmodel" "models/kirillian/weapons/c_models/c_pyro_arms_zombie.mdl" "weapon" { @@ -167,6 +168,7 @@ "maxspree" "10.0" "maxhorde" "10.0" "menu" "Menu_ClassesInfectedDemoman" + "viewmodel" "models/kirillian/weapons/c_models/c_demo_arms_zombie.mdl" "weapon" { @@ -183,6 +185,7 @@ "maxspree" "10.0" "maxhorde" "10.0" "menu" "Menu_ClassesInfectedHeavy" + "viewmodel" "models/kirillian/weapons/c_models/c_heavy_arms_zombie.mdl" "weapon" { @@ -207,6 +210,7 @@ "regen" "-1" "degen" "4" "menu" "Menu_ClassesInfectedMedic" + "viewmodel" "models/kirillian/weapons/c_models/c_medic_arms_zombie.mdl" "weapon" { @@ -217,6 +221,7 @@ "sniper" { "menu" "Menu_ClassesInfectedSniper" + "viewmodel" "models/kirillian/weapons/c_models/c_sniper_arms_zombie.mdl" "weapon" { @@ -227,6 +232,7 @@ "spy" { "menu" "Menu_ClassesInfectedSpy" + "viewmodel" "models/kirillian/weapons/c_models/c_spy_arms_zombie.mdl" "weapon" { @@ -251,13 +257,11 @@ "menu" "Menu_ClassesInfectedSpecialTank" "worldmodel" "models/kirillian/infected/hank_v4.mdl" - "viewmodel" "models/kirillian/weapons/hank_viewmodel.mdl" - "viewmodel_angles" "0.0 0.0 0.0" - "viewmodel_height" "-2.0" + "viewmodel" "models/kirillian/weapons/hank_viewmodel_v2f.mdl" + "viewmodel_anim" "1" "callback_spawn" "Infected_OnTankSpawn" "callback_rage" "Infected_DoNoRage" - "callback_anim" "Infected_OnTankAnim" "callback_touch" "Infected_OnTankTouch" "callback_death" "Infected_OnTankDeath" @@ -265,6 +269,8 @@ { "index" "5" // Fists "attrib" "329 ; 0.0 ; 405 ; 0.0 ; 107 ; 1.8" // Airblast immunity, vertical airblast immunity, move speed bonus + "logname" "warrior_spirit" + "iconname" "warrior_spirit" } } @@ -275,18 +281,18 @@ "menu" "Menu_ClassesInfectedSpecialBoomer" "worldmodel" "models/kirillian/infected/hoomer_v4.mdl" - "viewmodel" "models/kirillian/weapons/hoomer_viewmodel.mdl" - "viewmodel_angles" "-5.0 0.0 0.0" - "viewmodel_height" "-4.0" + "viewmodel" "models/kirillian/weapons/hoomer_viewmodel_v2f.mdl" + "viewmodel_anim" "1" "sound_spawn" "szf/music/bacteria/boomerbacterias.mp3" "callback_rage" "Infected_DoBoomerRage" - "callback_anim" "Infected_OnBoomerAnim" "callback_death" "Infected_OnBoomerDeath" "weapon" { "index" "5" // Fists + "logname" "warrior_spirit" + "iconname" "warrior_spirit" } } @@ -297,20 +303,20 @@ "menu" "Menu_ClassesInfectedSpecialCharger" "worldmodel" "models/kirillian/infected/coomer_v4.mdl" - "viewmodel" "models/kirillian/weapons/coomer_viewmodel.mdl" - "viewmodel_angles" "-35.0 0.0 0.0" - "viewmodel_height" "-30.0" + "viewmodel" "models/kirillian/weapons/coomer_viewmodel_v2f.mdl" + "viewmodel_anim" "1" "sound_spawn" "szf/music/bacteria/chargerbacterias.mp3" "ragecooldown" "16" "callback_spawn" "Infected_OnChargerSpawn" "callback_rage" "Infected_DoChargerCharge" "callback_think" "Infected_OnChargerThink" - "callback_anim" "Infected_OnChargerAnim" "weapon" { "index" "5" // Fists + "logname" "gloves" + "iconname" "gloves" } } @@ -363,22 +369,21 @@ "menu" "Menu_ClassesInfectedSpecialHunter" "worldmodel" "models/kirillian/infected/scunter_v4.mdl" - "viewmodel" "models/kirillian/weapons/scunter_viewmodel.mdl" - "viewmodel_angles" "-5.0 0.0 0.0" - "viewmodel_height" "-4.0" + "viewmodel" "models/kirillian/weapons/scunter_viewmodel_v2f.mdl" + "viewmodel_anim" "1" "sound_spawn" "szf/music/bacteria/hunterbacterias.mp3" "ragecooldown" "3" "callback_rage" "Infected_DoHunterJump" "callback_think" "Infected_OnHunterThink" - "callback_anim" "Infected_OnHunterAnim" "callback_touch" "Infected_OnHunterTouch" "callback_death" "Infected_OnHunterDeath" "weapon" { "index" "5" // Fists - "attrib" "1 ; 0.54 ; 396 ; 0.625" // Less damage and faster attack speed to match with bat + "logname" "unarmed_combat" + "iconname" "unarmed_combat" } } @@ -390,16 +395,18 @@ "menu" "Menu_ClassesInfectedSpecialSmoker" "worldmodel" "models/kirillian/infected/wanker_v4.mdl" - "viewmodel" "models/kirillian/weapons/wank_viewmodel.mdl" + "viewmodel" "models/kirillian/weapons/wank_viewmodel_v2f.mdl" + "viewmodel_anim" "1" "sound_spawn" "szf/music/bacteria/smokerbacterias.mp3" "callback_rage" "Infected_DoNoRage" "callback_think" "Infected_OnSmokerThink" - "callback_anim" "Infected_OnSmokerAnim" "weapon" { "index" "5" // Fists + "logname" "unarmed_combat" + "iconname" "unarmed_combat" } } @@ -410,13 +417,12 @@ "menu" "Menu_ClassesInfectedSpecialSpitter" "worldmodel" "models/kirillian/infected/spyro_v4.mdl" - "viewmodel" "models/kirillian/weapons/spyro_viewmodel.mdl" - "viewmodel_height" "-4.0" + "viewmodel" "models/kirillian/weapons/spyro_viewmodel_v2f.mdl" + "viewmodel_anim" "1" "sound_spawn" "szf/music/bacteria/spitterbacterias.mp3" "ragecooldown" "16" "callback_rage" "Infected_DoSpitterGas" - "callback_anim" "Infected_OnSpitterAnim" "callback_death" "Infected_OnSpitterDeath" "weapon" @@ -428,6 +434,8 @@ "weapon" { "index" "5" // Fists + "logname" "hot_hand" + "iconname" "hot_hand" } } @@ -438,20 +446,21 @@ "menu" "Menu_ClassesInfectedSpecialJockey" "worldmodel" "models/kirillian/infected/sock_v4.mdl" - "viewmodel" "models/kirillian/weapons/sock_viewmodel.mdl" - "viewmodel_height" "-4.0" + "viewmodel" "models/kirillian/weapons/sock_viewmodel_v2f.mdl" + "viewmodel_anim" "1" "sound_spawn" "szf/music/bacteria/jockeybacterias.mp3" "ragecooldown" "6" "callback_rage" "Infected_DoJockeyJump" "callback_think" "Infected_OnJockeyThink" "callback_touch" "Infected_OnJockeyTouch" - "callback_anim" "Infected_OnJockeyAnim" "callback_death" "Infected_OnJockeyDeath" "weapon" { "index" "5" // Fists + "logname" "unarmed_combat" + "iconname" "unarmed_combat" } } } diff --git a/addons/sourcemod/gamedata/szf.txt b/addons/sourcemod/gamedata/szf.txt index 4da8c48b..8db7821f 100644 --- a/addons/sourcemod/gamedata/szf.txt +++ b/addons/sourcemod/gamedata/szf.txt @@ -16,12 +16,6 @@ "linux" "@_ZN9CTFPlayer20PlaySpecificSequenceEPKc" "windows" "\x55\x8B\xEC\x53\x56\x8B\x75\x08\x57\x56\x8B\xF9\xE8\x2A\x2A\x2A\x2A\x8B\xD8" } - "CTFPlayer::DoAnimationEvent" - { - "library" "server" - "linux" "@_ZN9CTFPlayer16DoAnimationEventE17PlayerAnimEvent_ti" - "windows" "\x55\x8B\xEC\x51\x53\x56\x8B\x35\x2A\x2A\x2A\x2A\x8B\xD9\x8B\xCE" - } "CTFPlayer::GetLoadoutItem" { "library" "server" @@ -86,24 +80,6 @@ } "Functions" { - "CTFPlayer::DoAnimationEvent" - { - "signature" "CTFPlayer::DoAnimationEvent" - "callconv" "thiscall" - "return" "void" - "this" "entity" - "arguments" - { - "event" - { - "type" "int" - } - "nData" - { - "type" "int" - } - } - } "CTFPlayer::TeamFortress_CalculateMaxSpeed" { "signature" "CTFPlayer::TeamFortress_CalculateMaxSpeed" diff --git a/addons/sourcemod/scripting/superzombiefortress.sp b/addons/sourcemod/scripting/superzombiefortress.sp index 52be0675..53105805 100644 --- a/addons/sourcemod/scripting/superzombiefortress.sp +++ b/addons/sourcemod/scripting/superzombiefortress.sp @@ -244,15 +244,13 @@ enum struct ClientClasses char sMenu[64]; char sWorldModel[PLATFORM_MAX_PATH]; char sViewModel[PLATFORM_MAX_PATH]; - float vecViewModelAngles[3]; - float flViewModelHeight; + bool bViewModelAnim; char sSoundSpawn[PLATFORM_MAX_PATH]; int iRageCooldown; Function callback_spawn; Function callback_rage; Function callback_think; Function callback_touch; - Function callback_anim; Function callback_death; //Infected @@ -763,7 +761,7 @@ public void TF2_OnConditionRemoved(int iClient, TFCond nCond) SDKCall_SetSpeed(iClient); if (nCond == TFCond_Taunting) - ViewModel_Hide(iClient); + ViewModel_UpdateClient(iClient); // taunting removes EF_NODRAW from weapon, readd it back else if (nCond == TFCond_Disguised) SetEntProp(iClient, Prop_Send, "m_nModelIndexOverrides", 0, _, VISION_MODE_ROME); //Reset disguise model } @@ -1861,6 +1859,7 @@ void HandleSurvivorLoadout(int iClient) return; CheckClientWeapons(iClient); + ViewModel_RemoveWearable(iClient); for (int iSlot = WeaponSlot_Melee; iSlot <= WeaponSlot_InvisWatch; iSlot++) { @@ -1926,9 +1925,6 @@ void HandleSurvivorLoadout(int iClient) SetVariantString(""); AcceptEntityInput(iClient, "SetCustomModel"); - //Remove any existing viewmodels - ViewModel_Destroy(iClient); - //Prevent Survivors with voodoo-cursed souls SetEntProp(iClient, Prop_Send, "m_bForcedSkin", 0); SetEntProp(iClient, Prop_Send, "m_nForcedSkin", 0); @@ -1946,6 +1942,8 @@ void HandleZombieLoadout(int iClient) while (g_ClientClasses[iClient].GetWeapon(iPos, weapon)) TF2_CreateAndEquipWeapon(iClient, weapon.iIndex, weapon.sAttribs); + ViewModel_UpdateClient(iClient); + if (g_ClientClasses[iClient].sWorldModel[0]) { SetVariantString(g_ClientClasses[iClient].sWorldModel); @@ -1961,19 +1959,8 @@ void HandleZombieLoadout(int iClient) ApplyVoodooCursedSoul(iClient); } - ViewModel_Destroy(iClient); - - if (g_ClientClasses[iClient].sViewModel[0]) - { - ViewModel_Create(iClient, g_ClientClasses[iClient].sViewModel, g_ClientClasses[iClient].vecViewModelAngles, g_ClientClasses[iClient].flViewModelHeight); - ViewModel_Hide(iClient); - } - if (g_ClientClasses[iClient].bThirdperson) - { - SetEntProp(GetEntPropEnt(iClient, Prop_Send, "m_hViewModel"), Prop_Send, "m_fEffects", EF_NODRAW); RequestFrame(SetThirdperson, GetClientSerial(iClient)); - } //Reset metal for TF2 to give back correct amount from attribs TF2_SetMetal(iClient, 0); @@ -1982,7 +1969,10 @@ void HandleZombieLoadout(int iClient) int iMelee = TF2_GetItemInSlot(iClient, WeaponSlot_Melee); if (iMelee > MaxClients) { - SetEntPropEnt(iClient, Prop_Send, "m_hActiveWeapon", iMelee); + TF2_SwitchActiveWeapon(iClient, iMelee); + if (g_ClientClasses[iClient].bViewModelAnim) // needed for some reason for custom anims + ViewModel_SetAnimation(iClient, "ACT_FISTS_VM_DRAW"); + AddWeaponVision(iMelee, TF_VISION_FILTER_HALLOWEEN); //Allow see Voodoo souls AddWeaponVision(iMelee, TF_VISION_FILTER_ROME); //Allow see spy's custom model disguise detour fix } @@ -2502,6 +2492,9 @@ public Action OnPlayerRunCmd(int iClient, int &iButtons, int &iImpulse, float fV Action OnGiveNamedItem(int iClient, const char[] sClassname, int iIndex) { + // Reset arms so generated weapons don't get the wrong viewmodel + ViewModel_ResetArms(iClient); + if (g_bGiveNamedItemSkip || TF2_IsPlayerInCondition(iClient, TFCond_Disguised)) return Plugin_Continue; diff --git a/addons/sourcemod/scripting/szf/classes.sp b/addons/sourcemod/scripting/szf/classes.sp index 28d10edf..bed2af70 100644 --- a/addons/sourcemod/scripting/szf/classes.sp +++ b/addons/sourcemod/scripting/szf/classes.sp @@ -27,7 +27,6 @@ void Classes_Refresh() g_DefaultClasses.callback_rage = INVALID_FUNCTION; g_DefaultClasses.callback_think = INVALID_FUNCTION; g_DefaultClasses.callback_touch = INVALID_FUNCTION; - g_DefaultClasses.callback_anim = INVALID_FUNCTION; g_DefaultClasses.callback_death = INVALID_FUNCTION; g_iSurvivorClassCount = 0; @@ -193,23 +192,29 @@ bool Classes_LoadInfected(KeyValues kv, const char[] sKey, ClientClasses classes void Classes_Precache() { + for (TFClassType nClass = TFClass_Scout; nClass <= TFClass_Engineer; nClass++) + Classes_PrecacheClass(g_ZombieClasses[nClass]); + for (Infected nInfected; nInfected < Infected_Count; nInfected++) + Classes_PrecacheClass(g_InfectedClasses[nInfected]); +} + +void Classes_PrecacheClass(ClientClasses class) +{ + if (class.sWorldModel[0]) { - if (g_InfectedClasses[nInfected].sWorldModel[0]) - { - PrecacheModel(g_InfectedClasses[nInfected].sWorldModel); - AddModelToDownloadsTable(g_InfectedClasses[nInfected].sWorldModel); - } - - if (g_InfectedClasses[nInfected].sViewModel[0]) - { - PrecacheModel(g_InfectedClasses[nInfected].sViewModel); - AddModelToDownloadsTable(g_InfectedClasses[nInfected].sViewModel); - } - - if (g_InfectedClasses[nInfected].sSoundSpawn[0]) - PrecacheSound2(g_InfectedClasses[nInfected].sSoundSpawn); + PrecacheModel(class.sWorldModel); + AddModelToDownloadsTable(class.sWorldModel); + } + + if (class.sViewModel[0]) + { + PrecacheModel(class.sViewModel); + AddModelToDownloadsTable(class.sViewModel); } + + if (class.sSoundSpawn[0]) + PrecacheSound2(class.sSoundSpawn); } void Classes_SetClient(int iClient, Infected nInfected = view_as(-1), TFClassType iClass = TFClass_Unknown) diff --git a/addons/sourcemod/scripting/szf/config.sp b/addons/sourcemod/scripting/szf/config.sp index 429af8b6..7ca14597 100644 --- a/addons/sourcemod/scripting/szf/config.sp +++ b/addons/sourcemod/scripting/szf/config.sp @@ -270,15 +270,13 @@ bool Config_LoadClassesSection(KeyValues kv, ClientClasses classes) kv.GetString("menu", classes.sMenu, sizeof(classes.sMenu)); kv.GetString("worldmodel", classes.sWorldModel, sizeof(classes.sWorldModel), classes.sWorldModel); kv.GetString("viewmodel", classes.sViewModel, sizeof(classes.sViewModel), classes.sViewModel); - kv.GetVector("viewmodel_angles", classes.vecViewModelAngles, classes.vecViewModelAngles); - classes.flViewModelHeight = kv.GetFloat("viewmodel_height", classes.flViewModelHeight); + classes.bViewModelAnim = !!kv.GetNum("viewmodel_anim", classes.bViewModelAnim); kv.GetString("sound_spawn", classes.sSoundSpawn, sizeof(classes.sSoundSpawn), classes.sSoundSpawn); classes.iRageCooldown = kv.GetNum("ragecooldown", classes.iRageCooldown); classes.callback_spawn = Config_GetFunction(kv, "callback_spawn", classes.callback_spawn); classes.callback_rage = Config_GetFunction(kv, "callback_rage", classes.callback_rage); classes.callback_think = Config_GetFunction(kv, "callback_think", classes.callback_think); classes.callback_touch = Config_GetFunction(kv, "callback_touch", classes.callback_touch); - classes.callback_anim = Config_GetFunction(kv, "callback_anim", classes.callback_anim); classes.callback_death = Config_GetFunction(kv, "callback_death", classes.callback_death); return true; diff --git a/addons/sourcemod/scripting/szf/dhook.sp b/addons/sourcemod/scripting/szf/dhook.sp index f60ab540..581c97f9 100644 --- a/addons/sourcemod/scripting/szf/dhook.sp +++ b/addons/sourcemod/scripting/szf/dhook.sp @@ -21,7 +21,6 @@ void DHook_Init(GameData hSZF) { g_aDHookDetours = new ArrayList(sizeof(Detour)); - DHook_CreateDetour(hSZF, "CTFPlayer::DoAnimationEvent", DHook_DoAnimationEventPre, _); DHook_CreateDetour(hSZF, "CTFPlayer::TeamFortress_CalculateMaxSpeed", _, DHook_CalculateMaxSpeedPost); DHook_CreateDetour(hSZF, "CTFWeaponBaseMelee::DoSwingTraceInternal", DHook_DoSwingTraceInternalPre, DHook_DoSwingTraceInternalPost); @@ -121,35 +120,6 @@ void DHook_Disable() } } -public MRESReturn DHook_DoAnimationEventPre(int iClient, DHookParam hParams) -{ - if (g_ClientClasses[iClient].callback_anim != INVALID_FUNCTION) - { - PlayerAnimEvent_t nAnim = hParams.Get(1); - int iData = hParams.Get(2); - - Call_StartFunction(null, g_ClientClasses[iClient].callback_anim); - Call_PushCell(iClient); - Call_PushCellRef(nAnim); - Call_PushCellRef(iData); - - Action action; - Call_Finish(action); - - if (action >= Plugin_Handled) - return MRES_Supercede; - - if (action == Plugin_Changed) - { - hParams.Set(1, nAnim); - hParams.Set(2, iData); - return MRES_ChangedOverride; - } - } - - return MRES_Ignored; -} - public MRESReturn DHook_CalculateMaxSpeedPost(int iClient, DHookReturn hReturn) { if (IsClientInGame(iClient) && IsPlayerAlive(iClient)) diff --git a/addons/sourcemod/scripting/szf/event.sp b/addons/sourcemod/scripting/szf/event.sp index 0bea72dd..25fbd696 100644 --- a/addons/sourcemod/scripting/szf/event.sp +++ b/addons/sourcemod/scripting/szf/event.sp @@ -233,9 +233,6 @@ public Action Event_PlayerDeath(Event event, const char[] name, bool dontBroadca DropCarryingItem(iVictim); - if (!bDeadRinger) - ViewModel_Destroy(iVictim); - //Handle bonuses if (!bDeadRinger && IsValidZombie(iKillers[0]) && iKillers[0] != iVictim) { diff --git a/addons/sourcemod/scripting/szf/infected.sp b/addons/sourcemod/scripting/szf/infected.sp index b2b682ef..8cd325b7 100644 --- a/addons/sourcemod/scripting/szf/infected.sp +++ b/addons/sourcemod/scripting/szf/infected.sp @@ -130,34 +130,6 @@ public Action Infected_TankTimer(Handle hTimer, int iSerial) return Plugin_Continue; } -public Action Infected_OnTankAnim(int iClient, PlayerAnimEvent_t &nAnim, int &iData) -{ - if (nAnim == PLAYERANIMEVENT_SPAWN) - { - ViewModel_SetDefaultAnimation(iClient, "f_idle"); - ViewModel_SetAnimation(iClient, "f_draw"); - } - else if (nAnim == PLAYERANIMEVENT_ATTACK_PRIMARY || nAnim == PLAYERANIMEVENT_ATTACK_SECONDARY || nAnim == PLAYERANIMEVENT_ATTACK_GRENADE) - { - //One of those anim always get played because of force crit, pick one of those at random - //TODO check if all 3 anim exists - - switch (GetRandomInt(1, 3)) - { - case 1: nAnim = PLAYERANIMEVENT_ATTACK_PRIMARY; - case 2: nAnim = PLAYERANIMEVENT_ATTACK_SECONDARY; - case 3: nAnim = PLAYERANIMEVENT_ATTACK_GRENADE; - } - - ViewModel_SetAnimation(iClient, "f_swing_crit"); - return Plugin_Changed; - } - - //TODO check death anim - - return Plugin_Continue; -} - public void Infected_OnTankTouch(int iClient, int iToucher) { if (IsClassname(iToucher, "func_respawnroom")) @@ -254,43 +226,6 @@ public void Infected_DoBoomerRage(int iClient) Infected_DoBoomerExplosion(iClient, 600.0); } -public Action Infected_OnBoomerAnim(int iClient, PlayerAnimEvent_t &nAnim, int &iData) -{ - if (nAnim == PLAYERANIMEVENT_SPAWN) - { - ViewModel_SetDefaultAnimation(iClient, "f_idle"); - ViewModel_SetAnimation(iClient, "f_draw"); - } - else if (nAnim == PLAYERANIMEVENT_ATTACK_PRIMARY || nAnim == PLAYERANIMEVENT_ATTACK_SECONDARY || nAnim == PLAYERANIMEVENT_ATTACK_GRENADE) - { - //One of those anim always get played because of no random crit, pick one of those at random - //TODO check if all 3 anim exists, and swings with correct anim - - switch (GetRandomInt(1, 3)) - { - case 1: - { - nAnim = PLAYERANIMEVENT_ATTACK_PRIMARY; - ViewModel_SetAnimation(iClient, "f_swing_left"); - } - case 2: - { - nAnim = PLAYERANIMEVENT_ATTACK_SECONDARY; - ViewModel_SetAnimation(iClient, "f_swing_right"); - } - case 3: - { - nAnim = PLAYERANIMEVENT_ATTACK_GRENADE; - ViewModel_SetAnimation(iClient, "f_swing_crit"); - } - } - - return Plugin_Changed; - } - - return Plugin_Continue; -} - public void Infected_OnBoomerDeath(int iClient, int iKiller, int iAssist) { Infected_DoBoomerExplosion(iClient, 400.0); @@ -423,27 +358,6 @@ public void Infected_OnChargerThink(int iClient, int &iButtons) } } -public Action Infected_OnChargerAnim(int iClient, PlayerAnimEvent_t &nAnim, int &iData) -{ - if (nAnim == PLAYERANIMEVENT_SPAWN) - { - ViewModel_SetDefaultAnimation(iClient, "b_idle"); - ViewModel_SetAnimation(iClient, "b_draw"); - } - else if (nAnim == PLAYERANIMEVENT_ATTACK_PRIMARY || nAnim == PLAYERANIMEVENT_ATTACK_SECONDARY || nAnim == PLAYERANIMEVENT_ATTACK_GRENADE) - { - switch (GetRandomInt(1, 2)) - { - case 1: ViewModel_SetAnimation(iClient, "b_swing_a"); - case 2: ViewModel_SetAnimation(iClient, "b_swing_b"); - } - - return Plugin_Changed; - } - - return Plugin_Continue; -} - //////////////// // Screamer //////////////// @@ -548,7 +462,7 @@ public void Infected_DoHunterJump(int iClient) vecVelocity[2] = 460.0; SDKCall_PlaySpecificSequence(iClient, "pounce_idle_low"); - ViewModel_SetAnimation(iClient, "claw_lunge_layer"); + ViewModel_SetAnimation(iClient, "ACT_VM_LUNGE_LAYER"); TeleportEntity(iClient, NULL_VECTOR, NULL_VECTOR, vecVelocity); SetEntProp(iClient, Prop_Send, "m_iAirDash", 1); @@ -567,26 +481,6 @@ public void Infected_OnHunterThink(int iClient, int &iButtons) g_bHunterIsUsingPounce[iClient] = false; } -public Action Infected_OnHunterAnim(int iClient, PlayerAnimEvent_t &nAnim, int &iData) -{ - if (nAnim == PLAYERANIMEVENT_SPAWN) - { - ViewModel_SetDefaultAnimation(iClient, "b_idle"); - ViewModel_SetAnimation(iClient, "b_draw"); - } - else if (nAnim == PLAYERANIMEVENT_ATTACK_PRIMARY || nAnim == PLAYERANIMEVENT_ATTACK_SECONDARY || nAnim == PLAYERANIMEVENT_ATTACK_GRENADE) - { - switch (GetRandomInt(1, 3)) - { - case 1: ViewModel_SetAnimation(iClient, "b_swing_a"); - case 2: ViewModel_SetAnimation(iClient, "b_swing_b"); - case 3: ViewModel_SetAnimation(iClient, "b_swing_c"); - } - } - - return Plugin_Continue; -} - public void Infected_OnHunterTouch(int iClient, int iToucher) { if (!g_bHunterIsUsingPounce[iClient] || !IsValidLivingSurvivor(iToucher)) @@ -637,7 +531,7 @@ public void Infected_OnSmokerThink(int iClient, int &iButtons) } else if (GetEntityMoveType(iClient) == MOVETYPE_NONE) { - ViewModel_SetAnimation(iClient, "cough"); + ViewModel_SetAnimation(iClient, "ACT_VM_COUGH"); g_iSmokerBeamHits[iClient] = 0; g_iSmokerBeamHitVictim[iClient] = 0; @@ -700,7 +594,7 @@ void Infected_DoSmokerBeam(int iClient) g_iSmokerBeamHits[iClient] = 0; SDKCall_PlaySpecificSequence(iClient, "tongue_attack_drag_survivor_idle"); - ViewModel_SetAnimation(iClient, "tongue"); + ViewModel_SetAnimation(iClient, "ACT_VM_TONGUE"); } //Increase count and if it reaches a threshold, apply damage @@ -724,24 +618,6 @@ void Infected_DoSmokerBeam(int iClient) delete hTrace; } -public Action Infected_OnSmokerAnim(int iClient, PlayerAnimEvent_t &nAnim, int &iData) -{ - if (nAnim == PLAYERANIMEVENT_SPAWN) - { - ViewModel_SetDefaultAnimation(iClient, "m_idle"); - } - else if (nAnim == PLAYERANIMEVENT_ATTACK_PRIMARY || nAnim == PLAYERANIMEVENT_ATTACK_SECONDARY || nAnim == PLAYERANIMEVENT_ATTACK_GRENADE) - { - switch (GetRandomInt(1, 2)) - { - case 1: ViewModel_SetAnimation(iClient, "m_swing_a"); - case 2: ViewModel_SetAnimation(iClient, "m_swing_b"); - } - } - - return Plugin_Continue; -} - //////////////// // Spitter //////////////// @@ -749,7 +625,7 @@ public Action Infected_OnSmokerAnim(int iClient, PlayerAnimEvent_t &nAnim, int & public void Infected_DoSpitterGas(int iClient) { SDKCall_PlaySpecificSequence(iClient, "spitter_spitting"); - ViewModel_SetAnimation(iClient, "spit"); + ViewModel_SetAnimation(iClient, "ACT_VM_VOMIT"); TF2_AddCondition(iClient, TFCond_FreezeInput, 1.0); @@ -758,21 +634,6 @@ public void Infected_DoSpitterGas(int iClient) SDKCall_TossJarThink(iGas); } -public Action Infected_OnSpitterAnim(int iClient, PlayerAnimEvent_t &nAnim, int &iData) -{ - if (nAnim == PLAYERANIMEVENT_SPAWN) - { - ViewModel_SetDefaultAnimation(iClient, "fa_idle"); - ViewModel_SetAnimation(iClient, "fa_draw"); - } - else if (nAnim == PLAYERANIMEVENT_ATTACK_PRIMARY || nAnim == PLAYERANIMEVENT_ATTACK_SECONDARY || nAnim == PLAYERANIMEVENT_ATTACK_GRENADE) - { - ViewModel_SetAnimation(iClient, "fa_swing_a"); - } - - return Plugin_Continue; -} - public void Infected_OnSpitterDeath(int iVictim, int iKiller, int iAssist) { int iGas = CreateEntityByName("tf_projectile_jar_gas"); @@ -809,7 +670,7 @@ public void Infected_DoJockeyJump(int iClient) vecVelocity[2] = 345.0; SDKCall_PlaySpecificSequence(iClient, "Pounce"); - ViewModel_SetAnimation(iClient, "lunge"); + ViewModel_SetAnimation(iClient, "ACT_VM_LUNGE"); TeleportEntity(iClient, NULL_VECTOR, NULL_VECTOR, vecVelocity); SetEntProp(iClient, Prop_Send, "m_bJumping", true); @@ -894,21 +755,6 @@ public void Infected_OnJockeyTouch(int iClient, int iToucher) SDKCall_PlaySpecificSequence(iClient, "jockey_ride"); } -public Action Infected_OnJockeyAnim(int iClient, PlayerAnimEvent_t &nAnim, int &iData) -{ - if (nAnim == PLAYERANIMEVENT_SPAWN) - { - ViewModel_SetDefaultAnimation(iClient, "s_idle"); - ViewModel_SetAnimation(iClient, "s_draw"); - } - else if (nAnim == PLAYERANIMEVENT_ATTACK_PRIMARY || nAnim == PLAYERANIMEVENT_ATTACK_SECONDARY || nAnim == PLAYERANIMEVENT_ATTACK_GRENADE) - { - ViewModel_SetAnimation(iClient, "s_swing_a"); - } - - return Plugin_Continue; -} - public void Infected_OnJockeyDeath(int iClient, int iKiller, int iAssist) { g_bJockeyIsUsingPounce[iClient] = false; diff --git a/addons/sourcemod/scripting/szf/pickupweapons.sp b/addons/sourcemod/scripting/szf/pickupweapons.sp index e737fdb8..57421220 100644 --- a/addons/sourcemod/scripting/szf/pickupweapons.sp +++ b/addons/sourcemod/scripting/szf/pickupweapons.sp @@ -655,19 +655,6 @@ void SetWeaponModel(int iEntity, Weapon wep) TeleportEntity(iEntity, vecOrigin, vecAngles, NULL_VECTOR); } -//Grabs the entity model by looking in the precache database of the server -void GetEntityModel(int iEntity, char[] sModel, int iMaxSize, char[] sPropName = "m_nModelIndex") -{ - int iIndex = GetEntProp(iEntity, Prop_Send, sPropName); - GetModelPath(iIndex, sModel, iMaxSize); -} - -void GetModelPath(int iIndex, char[] sModel, int iMaxSize) -{ - int iTable = FindStringTable("modelprecache"); - ReadStringTable(iTable, iIndex, sModel, iMaxSize); -} - int GetWeaponGlowEnt(int iEntity) { int iGlow = INVALID_ENT_REFERENCE; diff --git a/addons/sourcemod/scripting/szf/sdkhook.sp b/addons/sourcemod/scripting/szf/sdkhook.sp index 7ff28e99..261dd18a 100644 --- a/addons/sourcemod/scripting/szf/sdkhook.sp +++ b/addons/sourcemod/scripting/szf/sdkhook.sp @@ -30,6 +30,7 @@ void SDKHook_HookClient(int iClient) SDKHook(iClient, SDKHook_Touch, Client_Touch); SDKHook(iClient, SDKHook_OnTakeDamage, Client_OnTakeDamage); SDKHook(iClient, SDKHook_GetMaxHealth, Client_GetMaxHealth); + SDKHook(iClient, SDKHook_WeaponSwitchPost, Client_WeaponSwitchPost); } void SDKHook_UnhookClient(int iClient) @@ -39,6 +40,7 @@ void SDKHook_UnhookClient(int iClient) SDKUnhook(iClient, SDKHook_Touch, Client_Touch); SDKUnhook(iClient, SDKHook_OnTakeDamage, Client_OnTakeDamage); SDKUnhook(iClient, SDKHook_GetMaxHealth, Client_GetMaxHealth); + SDKUnhook(iClient, SDKHook_WeaponSwitchPost, Client_WeaponSwitchPost); } public Action Client_PreThink(int iClient) @@ -226,6 +228,11 @@ public Action Client_GetMaxHealth(int iClient, int &iMaxHealth) return Plugin_Continue; } +public void Client_WeaponSwitchPost(int iClient, int iWeapon) +{ + ViewModel_UpdateClient(iClient); +} + public Action Prop_SetSpawnedWeapon(int iWeapon) { SetWeapon(iWeapon); diff --git a/addons/sourcemod/scripting/szf/stocks.sp b/addons/sourcemod/scripting/szf/stocks.sp index fa38ba62..ea182fea 100644 --- a/addons/sourcemod/scripting/szf/stocks.sp +++ b/addons/sourcemod/scripting/szf/stocks.sp @@ -128,6 +128,25 @@ stock int GetReplaceRageWithSpecialInfectedSpawnCount() // Models //////////////// +//Grabs the entity model by looking in the precache database of the server +void GetEntityModel(int iEntity, char[] sModel, int iMaxSize, char[] sPropName = "m_nModelIndex") +{ + int iIndex = GetEntProp(iEntity, Prop_Send, sPropName); + GetModelPath(iIndex, sModel, iMaxSize); +} + +void GetModelPath(int iIndex, char[] sModel, int iMaxSize) +{ + int iTable = FindStringTable("modelprecache"); + ReadStringTable(iTable, iIndex, sModel, iMaxSize); +} + +int GetModelIndex(const char[] sModel) +{ + int iTable = FindStringTable("modelprecache"); + return FindStringIndex(iTable, sModel); +} + stock void AddModelToDownloadsTable(const char[] sModel) { static const char sFileType[][] = { @@ -483,7 +502,7 @@ stock void TF2_RemoveItemInSlot(int iClient, int iSlot) } //////////////// -// Entity Name +// Entities //////////////// stock bool IsClassname(int iEntity, const char[] sClassname) @@ -498,6 +517,16 @@ stock bool IsClassname(int iEntity, const char[] sClassname) return false; } +stock void AddEntityEffect(int iEntity, int iFlag) +{ + SetEntProp(iEntity, Prop_Send, "m_fEffects", GetEntProp(iEntity, Prop_Send, "m_fEffects") | iFlag); +} + +stock void RemoveEntityEffect(int iEntity, int iFlag) +{ + SetEntProp(iEntity, Prop_Send, "m_fEffects", GetEntProp(iEntity, Prop_Send, "m_fEffects") & ~iFlag); +} + //////////////// // Cloak //////////////// diff --git a/addons/sourcemod/scripting/szf/viewmodel.sp b/addons/sourcemod/scripting/szf/viewmodel.sp index 259dcdfe..c1fd2c36 100644 --- a/addons/sourcemod/scripting/szf/viewmodel.sp +++ b/addons/sourcemod/scripting/szf/viewmodel.sp @@ -1,90 +1,183 @@ -static int g_iViewModelRef[MAXPLAYERS] = {INVALID_ENT_REFERENCE, ...}; +char g_sViewModelsArms[][PLATFORM_MAX_PATH] = { + "", + "models/weapons/c_models/c_scout_arms.mdl", + "models/weapons/c_models/c_sniper_arms.mdl", + "models/weapons/c_models/c_soldier_arms.mdl", + "models/weapons/c_models/c_demo_arms.mdl", + "models/weapons/c_models/c_medic_arms.mdl", + "models/weapons/c_models/c_heavy_arms.mdl", + "models/weapons/c_models/c_pyro_arms.mdl", + "models/weapons/c_models/c_spy_arms.mdl", + "models/weapons/c_models/c_engineer_arms.mdl", +}; -void ViewModel_Create(int iClient, const char[] sModel, const float vecAnglesOffset[3] = NULL_VECTOR, float flHeight = 0.0) +void ViewModel_UpdateClient(int iClient) { - int iViewModel = CreateEntityByName("prop_dynamic"); - if (iViewModel <= MaxClients) - return; - - SetEntPropEnt(iViewModel, Prop_Send, "m_hOwnerEntity", iClient); - SetEntProp(iViewModel, Prop_Send, "m_nSkin", GetClientTeam(iClient) - 2); + int iViewModel = GetEntPropEnt(iClient, Prop_Send, "m_hViewModel"); - DispatchKeyValue(iViewModel, "model", sModel); - DispatchKeyValue(iViewModel, "disablereceiveshadows", "0"); - DispatchKeyValue(iViewModel, "disableshadows", "1"); + if (g_ClientClasses[iClient].bThirdperson) + { + ViewModel_RemoveWearable(iClient); + AddEntityEffect(iViewModel, EF_NODRAW); + } + else if (!g_ClientClasses[iClient].sViewModel[0]) + { + ViewModel_RemoveWearable(iClient); + } + else if (!g_ClientClasses[iClient].bViewModelAnim) + { + // Create a viewmodel for arm, and another for each weapons + + // Cleanup any unneeded viewmodels + int iArmsModelIndex = GetModelIndex(g_ClientClasses[iClient].sViewModel); + + int iWearable = INVALID_ENT_REFERENCE; + while ((iWearable = FindEntityByClassname(iWearable, "tf_wearable_vm")) != INVALID_ENT_REFERENCE) + { + if (GetEntPropEnt(iWearable, Prop_Send, "m_hOwnerEntity") != iClient) + continue; + + int iModelIndex = GetEntProp(iWearable, Prop_Send, "m_nModelIndex"); + if (iModelIndex == iArmsModelIndex) + continue; + + int iWeapon = GetEntPropEnt(iWearable, Prop_Send, "m_hWeaponAssociatedWith"); + if (iWeapon == INVALID_ENT_REFERENCE || GetEntPropEnt(iWeapon, Prop_Send, "m_hOwnerEntity") != iClient) + { + RemoveEntity(iWearable); + continue; + } + + if (iModelIndex == GetEntProp(iWeapon, Prop_Send, "m_iWorldModelIndex")) + continue; + + RemoveEntity(iWearable); + } + + // Create arm + if (ViewModel_Get(iClient, iArmsModelIndex, INVALID_ENT_REFERENCE) == INVALID_ENT_REFERENCE) + ViewModels_CreateWearable(iClient, iArmsModelIndex, INVALID_ENT_REFERENCE); + + // Create weapons + for (int iSlot = WeaponSlot_Primary; iSlot <= WeaponSlot_BuilderEngie; iSlot++) + { + int iWeapon = GetPlayerWeaponSlot(iClient, iSlot); + if (iWeapon == INVALID_ENT_REFERENCE) + continue; + + int iWeaponModelIndex = GetEntProp(iWeapon, Prop_Send, "m_iWorldModelIndex"); + iWearable = ViewModel_Get(iClient, iWeaponModelIndex, iWeapon); + if (iWearable == INVALID_ENT_REFERENCE) + ViewModels_CreateWearable(iClient, iWeaponModelIndex, iWeapon); + else + RemoveEntityEffect(iWearable, EF_NODRAW); // may've been hidden from weapon switching + } + + AddEntityEffect(iViewModel, EF_NODRAW); + } + else + { + ViewModel_RemoveWearable(iClient); + + SetEntityModel(iViewModel, g_ClientClasses[iClient].sViewModel); + RemoveEntityEffect(iViewModel, EF_NODRAW); + + int iModelIndex = GetModelIndex(g_ClientClasses[iClient].sViewModel); + + int iWeapon = GetEntPropEnt(iClient, Prop_Send, "m_hActiveWeapon"); + if (iWeapon != INVALID_ENT_REFERENCE) + { + SetEntityModel(iWeapon, g_ClientClasses[iClient].sViewModel); + SetEntProp(iWeapon, Prop_Send, "m_iViewModelIndex", iModelIndex); + SetEntProp(iWeapon, Prop_Send, "m_nCustomViewmodelModelIndex", iModelIndex); + AddEntityEffect(iWeapon, EF_NODRAW); + } + } +} + +int ViewModels_CreateWearable(int iClient, int iModelIndex, int iWeapon) +{ + int iWearable = CreateEntityByName("tf_wearable_vm"); float vecOrigin[3], vecAngles[3]; - GetClientAbsOrigin(iClient, vecOrigin); - GetClientAbsAngles(iClient, vecAngles); + GetEntPropVector(iClient, Prop_Send, "m_vecOrigin", vecOrigin); + GetEntPropVector(iClient, Prop_Send, "m_angRotation", vecAngles); + TeleportEntity(iWearable, vecOrigin, vecAngles, NULL_VECTOR); - vecOrigin[2] += flHeight; - AddVectors(vecAngles, vecAnglesOffset, vecAngles); + SetEntProp(iWearable, Prop_Send, "m_bValidatedAttachedEntity", true); + SetEntPropEnt(iWearable, Prop_Send, "m_hOwnerEntity", iClient); + SetEntProp(iWearable, Prop_Send, "m_iTeamNum", GetClientTeam(iClient)); + SetEntProp(iWearable, Prop_Send, "m_fEffects", EF_BONEMERGE|EF_BONEMERGE_FASTCULL); + SetEntPropEnt(iWearable, Prop_Send, "m_hWeaponAssociatedWith", iWeapon); - TeleportEntity(iViewModel, vecOrigin, vecAngles, NULL_VECTOR); - DispatchSpawn(iViewModel); + if (iWeapon != INVALID_ENT_REFERENCE) + SetEntPropEnt(iWeapon, Prop_Send, "m_hExtraWearableViewModel", iWearable); - SetVariantString("!activator"); - AcceptEntityInput(iViewModel, "SetParent", GetEntPropEnt(iClient, Prop_Send, "m_hViewModel")); + SetEntProp(iWearable, Prop_Send, "m_nModelIndex", iModelIndex); + DispatchSpawn(iWearable); - SDKHook(iViewModel, SDKHook_SetTransmit, ViewModel_SetTransmit); + SetVariantString("!activator"); + AcceptEntityInput(iWearable, "SetParent", GetEntPropEnt(iClient, Prop_Send, "m_hViewModel")); - g_iViewModelRef[iClient] = EntIndexToEntRef(iViewModel); + return EntIndexToEntRef(iWearable); } -void ViewModel_Hide(int iClient) +int ViewModel_Get(int iClient, int iModelIndex, int iWeapon) { - if (IsValidEntity(g_iViewModelRef[iClient])) - SetEntProp(GetEntPropEnt(iClient, Prop_Send, "m_hViewModel"), Prop_Send, "m_fEffects", EF_NODRAW); -} - -void ViewModel_SetAnimation(int iClient, const char[] sAnimation) -{ - if (IsValidEntity(g_iViewModelRef[iClient])) + int iWearable = INVALID_ENT_REFERENCE; + while ((iWearable = FindEntityByClassname(iWearable, "tf_wearable_vm")) != INVALID_ENT_REFERENCE) { - SetVariantString(sAnimation); - AcceptEntityInput(g_iViewModelRef[iClient], "SetAnimation"); + if (GetEntPropEnt(iWearable, Prop_Send, "m_hOwnerEntity") != iClient) + continue; + + if (GetEntProp(iWearable, Prop_Send, "m_nModelIndex") != iModelIndex) + continue; + + if (GetEntPropEnt(iWearable, Prop_Send, "m_hWeaponAssociatedWith") != iWeapon) + continue; + + return iWearable; } + + return iWearable; } -void ViewModel_SetDefaultAnimation(int iClient, const char[] sAnimation) +void ViewModel_RemoveWearable(int iClient) { - if (IsValidEntity(g_iViewModelRef[iClient])) - { - SetVariantString(sAnimation); - AcceptEntityInput(g_iViewModelRef[iClient], "SetDefaultAnimation"); - } + int iWearable = INVALID_ENT_REFERENCE; + while ((iWearable = FindEntityByClassname(iWearable, "tf_wearable_vm")) != INVALID_ENT_REFERENCE) + if (GetEntPropEnt(iWearable, Prop_Send, "m_hOwnerEntity") == iClient) + RemoveEntity(iWearable); } -void ViewModel_Destroy(int iClient) +void ViewModel_ResetArms(int iClient) { - if (IsValidEntity(g_iViewModelRef[iClient])) - RemoveEntity(g_iViewModelRef[iClient]); + TFClassType nClass = TF2_GetPlayerClass(iClient); + if (!g_sViewModelsArms[nClass][0]) + return; - g_iViewModelRef[iClient] = INVALID_ENT_REFERENCE; -} - -public Action ViewModel_SetTransmit(int iViewModel, int iClient) -{ - int iOwner = GetEntPropEnt(iViewModel, Prop_Send, "m_hOwnerEntity"); - if (!IsValidLivingClient(iOwner) || iViewModel != EntRefToEntIndex(g_iViewModelRef[iOwner])) - { - //Viewmodel entity no longer valid - ViewModel_Destroy(iOwner); - return Plugin_Handled; - } + int iViewModel = GetEntPropEnt(iClient, Prop_Send, "m_hViewModel"); + int iModelIndex = GetModelIndex(g_sViewModelsArms[nClass]); + + SetEntityModel(iViewModel, g_sViewModelsArms[nClass]); + SetEntProp(iViewModel, Prop_Send, "m_nModelIndex", iModelIndex); - //Allow if spectating owner and in firstperson - if (iClient != iOwner) + for (int iSlot = WeaponSlot_Primary; iSlot <= WeaponSlot_BuilderEngie; iSlot++) { - if (GetEntPropEnt(iClient, Prop_Send, "m_hObserverTarget") == iOwner && GetEntProp(iClient, Prop_Send, "m_iObserverMode") == OBS_MODE_IN_EYE) - return Plugin_Continue; + int iWeapon = GetPlayerWeaponSlot(iClient, iSlot); + if (iWeapon == INVALID_ENT_REFERENCE) + continue; - return Plugin_Handled; + SetEntityModel(iWeapon, g_sViewModelsArms[nClass]); + SetEntProp(iWeapon, Prop_Send, "m_iViewModelIndex", iModelIndex); + SetEntProp(iWeapon, Prop_Send, "m_nCustomViewmodelModelIndex", iModelIndex); } - - //Allow if client itself and in firstperson - if (TF2_IsPlayerInCondition(iClient, TFCond_Taunting) || GetEntProp(iClient, Prop_Send, "m_nForceTauntCam")) - return Plugin_Handled; - - return Plugin_Continue; -} \ No newline at end of file +} + +void ViewModel_SetAnimation(int iClient, const char[] sActivity) +{ + char sBuffer[256]; + Format(sBuffer, sizeof(sBuffer), "self.ResetSequence(self.LookupSequence(`%s`))", sActivity); // SetSequence/ResetSequence + SetVariantString(sBuffer); + AcceptEntityInput(GetEntPropEnt(iClient, Prop_Send, "m_hViewModel"), "RunScriptCode"); +} diff --git a/models/kirillian/weapons/c_models/c_demo_arms_zombie.dx80.vtx b/models/kirillian/weapons/c_models/c_demo_arms_zombie.dx80.vtx new file mode 100644 index 00000000..1e942ae3 Binary files /dev/null and b/models/kirillian/weapons/c_models/c_demo_arms_zombie.dx80.vtx differ diff --git a/models/kirillian/weapons/c_models/c_demo_arms_zombie.dx90.vtx b/models/kirillian/weapons/c_models/c_demo_arms_zombie.dx90.vtx new file mode 100644 index 00000000..e6b0926d Binary files /dev/null and b/models/kirillian/weapons/c_models/c_demo_arms_zombie.dx90.vtx differ diff --git a/models/kirillian/weapons/c_models/c_demo_arms_zombie.mdl b/models/kirillian/weapons/c_models/c_demo_arms_zombie.mdl new file mode 100644 index 00000000..31819ca6 Binary files /dev/null and b/models/kirillian/weapons/c_models/c_demo_arms_zombie.mdl differ diff --git a/models/kirillian/weapons/c_models/c_demo_arms_zombie.sw.vtx b/models/kirillian/weapons/c_models/c_demo_arms_zombie.sw.vtx new file mode 100644 index 00000000..0c4f1308 Binary files /dev/null and b/models/kirillian/weapons/c_models/c_demo_arms_zombie.sw.vtx differ diff --git a/models/kirillian/weapons/c_models/c_demo_arms_zombie.vvd b/models/kirillian/weapons/c_models/c_demo_arms_zombie.vvd new file mode 100644 index 00000000..a524d9c8 Binary files /dev/null and b/models/kirillian/weapons/c_models/c_demo_arms_zombie.vvd differ diff --git a/models/kirillian/weapons/c_models/c_heavy_arms_zombie.dx80.vtx b/models/kirillian/weapons/c_models/c_heavy_arms_zombie.dx80.vtx new file mode 100644 index 00000000..efc44d23 Binary files /dev/null and b/models/kirillian/weapons/c_models/c_heavy_arms_zombie.dx80.vtx differ diff --git a/models/kirillian/weapons/c_models/c_heavy_arms_zombie.dx90.vtx b/models/kirillian/weapons/c_models/c_heavy_arms_zombie.dx90.vtx new file mode 100644 index 00000000..50f9703c Binary files /dev/null and b/models/kirillian/weapons/c_models/c_heavy_arms_zombie.dx90.vtx differ diff --git a/models/kirillian/weapons/c_models/c_heavy_arms_zombie.mdl b/models/kirillian/weapons/c_models/c_heavy_arms_zombie.mdl new file mode 100644 index 00000000..3dbe9d0d Binary files /dev/null and b/models/kirillian/weapons/c_models/c_heavy_arms_zombie.mdl differ diff --git a/models/kirillian/weapons/c_models/c_heavy_arms_zombie.sw.vtx b/models/kirillian/weapons/c_models/c_heavy_arms_zombie.sw.vtx new file mode 100644 index 00000000..d8cf028b Binary files /dev/null and b/models/kirillian/weapons/c_models/c_heavy_arms_zombie.sw.vtx differ diff --git a/models/kirillian/weapons/c_models/c_heavy_arms_zombie.vvd b/models/kirillian/weapons/c_models/c_heavy_arms_zombie.vvd new file mode 100644 index 00000000..23d8303f Binary files /dev/null and b/models/kirillian/weapons/c_models/c_heavy_arms_zombie.vvd differ diff --git a/models/kirillian/weapons/c_models/c_medic_arms_zombie.dx80.vtx b/models/kirillian/weapons/c_models/c_medic_arms_zombie.dx80.vtx new file mode 100644 index 00000000..42c02a52 Binary files /dev/null and b/models/kirillian/weapons/c_models/c_medic_arms_zombie.dx80.vtx differ diff --git a/models/kirillian/weapons/c_models/c_medic_arms_zombie.dx90.vtx b/models/kirillian/weapons/c_models/c_medic_arms_zombie.dx90.vtx new file mode 100644 index 00000000..8477ffde Binary files /dev/null and b/models/kirillian/weapons/c_models/c_medic_arms_zombie.dx90.vtx differ diff --git a/models/kirillian/weapons/c_models/c_medic_arms_zombie.mdl b/models/kirillian/weapons/c_models/c_medic_arms_zombie.mdl new file mode 100644 index 00000000..8d8724a4 Binary files /dev/null and b/models/kirillian/weapons/c_models/c_medic_arms_zombie.mdl differ diff --git a/models/kirillian/weapons/c_models/c_medic_arms_zombie.sw.vtx b/models/kirillian/weapons/c_models/c_medic_arms_zombie.sw.vtx new file mode 100644 index 00000000..7ebd940e Binary files /dev/null and b/models/kirillian/weapons/c_models/c_medic_arms_zombie.sw.vtx differ diff --git a/models/kirillian/weapons/c_models/c_medic_arms_zombie.vvd b/models/kirillian/weapons/c_models/c_medic_arms_zombie.vvd new file mode 100644 index 00000000..9c8eeec0 Binary files /dev/null and b/models/kirillian/weapons/c_models/c_medic_arms_zombie.vvd differ diff --git a/models/kirillian/weapons/c_models/c_pyro_arms_zombie.dx80.vtx b/models/kirillian/weapons/c_models/c_pyro_arms_zombie.dx80.vtx new file mode 100644 index 00000000..e2eca60e Binary files /dev/null and b/models/kirillian/weapons/c_models/c_pyro_arms_zombie.dx80.vtx differ diff --git a/models/kirillian/weapons/c_models/c_pyro_arms_zombie.dx90.vtx b/models/kirillian/weapons/c_models/c_pyro_arms_zombie.dx90.vtx new file mode 100644 index 00000000..b938d718 Binary files /dev/null and b/models/kirillian/weapons/c_models/c_pyro_arms_zombie.dx90.vtx differ diff --git a/models/kirillian/weapons/c_models/c_pyro_arms_zombie.mdl b/models/kirillian/weapons/c_models/c_pyro_arms_zombie.mdl new file mode 100644 index 00000000..0bb813e6 Binary files /dev/null and b/models/kirillian/weapons/c_models/c_pyro_arms_zombie.mdl differ diff --git a/models/kirillian/weapons/c_models/c_pyro_arms_zombie.sw.vtx b/models/kirillian/weapons/c_models/c_pyro_arms_zombie.sw.vtx new file mode 100644 index 00000000..82dacc4c Binary files /dev/null and b/models/kirillian/weapons/c_models/c_pyro_arms_zombie.sw.vtx differ diff --git a/models/kirillian/weapons/c_models/c_pyro_arms_zombie.vvd b/models/kirillian/weapons/c_models/c_pyro_arms_zombie.vvd new file mode 100644 index 00000000..6364d0ba Binary files /dev/null and b/models/kirillian/weapons/c_models/c_pyro_arms_zombie.vvd differ diff --git a/models/kirillian/weapons/c_models/c_scout_arms_zombie.dx80.vtx b/models/kirillian/weapons/c_models/c_scout_arms_zombie.dx80.vtx new file mode 100644 index 00000000..ae717d64 Binary files /dev/null and b/models/kirillian/weapons/c_models/c_scout_arms_zombie.dx80.vtx differ diff --git a/models/kirillian/weapons/c_models/c_scout_arms_zombie.dx90.vtx b/models/kirillian/weapons/c_models/c_scout_arms_zombie.dx90.vtx new file mode 100644 index 00000000..c78d8702 Binary files /dev/null and b/models/kirillian/weapons/c_models/c_scout_arms_zombie.dx90.vtx differ diff --git a/models/kirillian/weapons/c_models/c_scout_arms_zombie.mdl b/models/kirillian/weapons/c_models/c_scout_arms_zombie.mdl new file mode 100644 index 00000000..23876f8a Binary files /dev/null and b/models/kirillian/weapons/c_models/c_scout_arms_zombie.mdl differ diff --git a/models/kirillian/weapons/c_models/c_scout_arms_zombie.sw.vtx b/models/kirillian/weapons/c_models/c_scout_arms_zombie.sw.vtx new file mode 100644 index 00000000..1afbd89d Binary files /dev/null and b/models/kirillian/weapons/c_models/c_scout_arms_zombie.sw.vtx differ diff --git a/models/kirillian/weapons/c_models/c_scout_arms_zombie.vvd b/models/kirillian/weapons/c_models/c_scout_arms_zombie.vvd new file mode 100644 index 00000000..58959cb3 Binary files /dev/null and b/models/kirillian/weapons/c_models/c_scout_arms_zombie.vvd differ diff --git a/models/kirillian/weapons/c_models/c_sniper_arms_zombie.dx80.vtx b/models/kirillian/weapons/c_models/c_sniper_arms_zombie.dx80.vtx new file mode 100644 index 00000000..65fd8a69 Binary files /dev/null and b/models/kirillian/weapons/c_models/c_sniper_arms_zombie.dx80.vtx differ diff --git a/models/kirillian/weapons/c_models/c_sniper_arms_zombie.dx90.vtx b/models/kirillian/weapons/c_models/c_sniper_arms_zombie.dx90.vtx new file mode 100644 index 00000000..ccb87851 Binary files /dev/null and b/models/kirillian/weapons/c_models/c_sniper_arms_zombie.dx90.vtx differ diff --git a/models/kirillian/weapons/c_models/c_sniper_arms_zombie.mdl b/models/kirillian/weapons/c_models/c_sniper_arms_zombie.mdl new file mode 100644 index 00000000..fd972f34 Binary files /dev/null and b/models/kirillian/weapons/c_models/c_sniper_arms_zombie.mdl differ diff --git a/models/kirillian/weapons/c_models/c_sniper_arms_zombie.sw.vtx b/models/kirillian/weapons/c_models/c_sniper_arms_zombie.sw.vtx new file mode 100644 index 00000000..ed06a80a Binary files /dev/null and b/models/kirillian/weapons/c_models/c_sniper_arms_zombie.sw.vtx differ diff --git a/models/kirillian/weapons/c_models/c_sniper_arms_zombie.vvd b/models/kirillian/weapons/c_models/c_sniper_arms_zombie.vvd new file mode 100644 index 00000000..43a578cf Binary files /dev/null and b/models/kirillian/weapons/c_models/c_sniper_arms_zombie.vvd differ diff --git a/models/kirillian/weapons/c_models/c_soldier_arms_zombie.dx80.vtx b/models/kirillian/weapons/c_models/c_soldier_arms_zombie.dx80.vtx new file mode 100644 index 00000000..3b7415f4 Binary files /dev/null and b/models/kirillian/weapons/c_models/c_soldier_arms_zombie.dx80.vtx differ diff --git a/models/kirillian/weapons/c_models/c_soldier_arms_zombie.dx90.vtx b/models/kirillian/weapons/c_models/c_soldier_arms_zombie.dx90.vtx new file mode 100644 index 00000000..9be1287b Binary files /dev/null and b/models/kirillian/weapons/c_models/c_soldier_arms_zombie.dx90.vtx differ diff --git a/models/kirillian/weapons/c_models/c_soldier_arms_zombie.mdl b/models/kirillian/weapons/c_models/c_soldier_arms_zombie.mdl new file mode 100644 index 00000000..9d8a6777 Binary files /dev/null and b/models/kirillian/weapons/c_models/c_soldier_arms_zombie.mdl differ diff --git a/models/kirillian/weapons/c_models/c_soldier_arms_zombie.sw.vtx b/models/kirillian/weapons/c_models/c_soldier_arms_zombie.sw.vtx new file mode 100644 index 00000000..3d81ca12 Binary files /dev/null and b/models/kirillian/weapons/c_models/c_soldier_arms_zombie.sw.vtx differ diff --git a/models/kirillian/weapons/c_models/c_soldier_arms_zombie.vvd b/models/kirillian/weapons/c_models/c_soldier_arms_zombie.vvd new file mode 100644 index 00000000..f1ce6ddc Binary files /dev/null and b/models/kirillian/weapons/c_models/c_soldier_arms_zombie.vvd differ diff --git a/models/kirillian/weapons/c_models/c_spy_arms_zombie.dx80.vtx b/models/kirillian/weapons/c_models/c_spy_arms_zombie.dx80.vtx new file mode 100644 index 00000000..c8665219 Binary files /dev/null and b/models/kirillian/weapons/c_models/c_spy_arms_zombie.dx80.vtx differ diff --git a/models/kirillian/weapons/c_models/c_spy_arms_zombie.dx90.vtx b/models/kirillian/weapons/c_models/c_spy_arms_zombie.dx90.vtx new file mode 100644 index 00000000..3bd84494 Binary files /dev/null and b/models/kirillian/weapons/c_models/c_spy_arms_zombie.dx90.vtx differ diff --git a/models/kirillian/weapons/c_models/c_spy_arms_zombie.mdl b/models/kirillian/weapons/c_models/c_spy_arms_zombie.mdl new file mode 100644 index 00000000..e1c78533 Binary files /dev/null and b/models/kirillian/weapons/c_models/c_spy_arms_zombie.mdl differ diff --git a/models/kirillian/weapons/c_models/c_spy_arms_zombie.sw.vtx b/models/kirillian/weapons/c_models/c_spy_arms_zombie.sw.vtx new file mode 100644 index 00000000..44779e8c Binary files /dev/null and b/models/kirillian/weapons/c_models/c_spy_arms_zombie.sw.vtx differ diff --git a/models/kirillian/weapons/c_models/c_spy_arms_zombie.vvd b/models/kirillian/weapons/c_models/c_spy_arms_zombie.vvd new file mode 100644 index 00000000..943226c7 Binary files /dev/null and b/models/kirillian/weapons/c_models/c_spy_arms_zombie.vvd differ diff --git a/models/kirillian/weapons/coomer_viewmodel.dx80.vtx b/models/kirillian/weapons/coomer_viewmodel_v2f.dx80.vtx similarity index 99% rename from models/kirillian/weapons/coomer_viewmodel.dx80.vtx rename to models/kirillian/weapons/coomer_viewmodel_v2f.dx80.vtx index 2f65cec4..526fb970 100644 Binary files a/models/kirillian/weapons/coomer_viewmodel.dx80.vtx and b/models/kirillian/weapons/coomer_viewmodel_v2f.dx80.vtx differ diff --git a/models/kirillian/weapons/coomer_viewmodel.dx90.vtx b/models/kirillian/weapons/coomer_viewmodel_v2f.dx90.vtx similarity index 99% rename from models/kirillian/weapons/coomer_viewmodel.dx90.vtx rename to models/kirillian/weapons/coomer_viewmodel_v2f.dx90.vtx index 0b0fa7c6..568f9d3b 100644 Binary files a/models/kirillian/weapons/coomer_viewmodel.dx90.vtx and b/models/kirillian/weapons/coomer_viewmodel_v2f.dx90.vtx differ diff --git a/models/kirillian/weapons/coomer_viewmodel.mdl b/models/kirillian/weapons/coomer_viewmodel_v2f.mdl similarity index 85% rename from models/kirillian/weapons/coomer_viewmodel.mdl rename to models/kirillian/weapons/coomer_viewmodel_v2f.mdl index 407b22ff..e468895a 100644 Binary files a/models/kirillian/weapons/coomer_viewmodel.mdl and b/models/kirillian/weapons/coomer_viewmodel_v2f.mdl differ diff --git a/models/kirillian/weapons/coomer_viewmodel.sw.vtx b/models/kirillian/weapons/coomer_viewmodel_v2f.sw.vtx similarity index 99% rename from models/kirillian/weapons/coomer_viewmodel.sw.vtx rename to models/kirillian/weapons/coomer_viewmodel_v2f.sw.vtx index bca20383..690ee061 100644 Binary files a/models/kirillian/weapons/coomer_viewmodel.sw.vtx and b/models/kirillian/weapons/coomer_viewmodel_v2f.sw.vtx differ diff --git a/models/kirillian/weapons/coomer_viewmodel.vvd b/models/kirillian/weapons/coomer_viewmodel_v2f.vvd similarity index 99% rename from models/kirillian/weapons/coomer_viewmodel.vvd rename to models/kirillian/weapons/coomer_viewmodel_v2f.vvd index e3813e0e..f9b14f28 100644 Binary files a/models/kirillian/weapons/coomer_viewmodel.vvd and b/models/kirillian/weapons/coomer_viewmodel_v2f.vvd differ diff --git a/models/kirillian/weapons/hank_viewmodel.dx80.vtx b/models/kirillian/weapons/hank_viewmodel_v2f.dx80.vtx similarity index 99% rename from models/kirillian/weapons/hank_viewmodel.dx80.vtx rename to models/kirillian/weapons/hank_viewmodel_v2f.dx80.vtx index c0bb481c..c37dc712 100644 Binary files a/models/kirillian/weapons/hank_viewmodel.dx80.vtx and b/models/kirillian/weapons/hank_viewmodel_v2f.dx80.vtx differ diff --git a/models/kirillian/weapons/hank_viewmodel.dx90.vtx b/models/kirillian/weapons/hank_viewmodel_v2f.dx90.vtx similarity index 99% rename from models/kirillian/weapons/hank_viewmodel.dx90.vtx rename to models/kirillian/weapons/hank_viewmodel_v2f.dx90.vtx index f180dfae..0166ed96 100644 Binary files a/models/kirillian/weapons/hank_viewmodel.dx90.vtx and b/models/kirillian/weapons/hank_viewmodel_v2f.dx90.vtx differ diff --git a/models/kirillian/weapons/hank_viewmodel.mdl b/models/kirillian/weapons/hank_viewmodel_v2f.mdl similarity index 71% rename from models/kirillian/weapons/hank_viewmodel.mdl rename to models/kirillian/weapons/hank_viewmodel_v2f.mdl index 335d1b75..7cb95791 100644 Binary files a/models/kirillian/weapons/hank_viewmodel.mdl and b/models/kirillian/weapons/hank_viewmodel_v2f.mdl differ diff --git a/models/kirillian/weapons/hank_viewmodel.sw.vtx b/models/kirillian/weapons/hank_viewmodel_v2f.sw.vtx similarity index 99% rename from models/kirillian/weapons/hank_viewmodel.sw.vtx rename to models/kirillian/weapons/hank_viewmodel_v2f.sw.vtx index 328cfecb..c57b256c 100644 Binary files a/models/kirillian/weapons/hank_viewmodel.sw.vtx and b/models/kirillian/weapons/hank_viewmodel_v2f.sw.vtx differ diff --git a/models/kirillian/weapons/hank_viewmodel.vvd b/models/kirillian/weapons/hank_viewmodel_v2f.vvd similarity index 99% rename from models/kirillian/weapons/hank_viewmodel.vvd rename to models/kirillian/weapons/hank_viewmodel_v2f.vvd index 510baf40..37c77c0c 100644 Binary files a/models/kirillian/weapons/hank_viewmodel.vvd and b/models/kirillian/weapons/hank_viewmodel_v2f.vvd differ diff --git a/models/kirillian/weapons/hoomer_viewmodel.dx80.vtx b/models/kirillian/weapons/hoomer_viewmodel_v2f.dx80.vtx similarity index 99% rename from models/kirillian/weapons/hoomer_viewmodel.dx80.vtx rename to models/kirillian/weapons/hoomer_viewmodel_v2f.dx80.vtx index 557b81d1..d293cc17 100644 Binary files a/models/kirillian/weapons/hoomer_viewmodel.dx80.vtx and b/models/kirillian/weapons/hoomer_viewmodel_v2f.dx80.vtx differ diff --git a/models/kirillian/weapons/hoomer_viewmodel.dx90.vtx b/models/kirillian/weapons/hoomer_viewmodel_v2f.dx90.vtx similarity index 99% rename from models/kirillian/weapons/hoomer_viewmodel.dx90.vtx rename to models/kirillian/weapons/hoomer_viewmodel_v2f.dx90.vtx index 8e00347e..0a9814ea 100644 Binary files a/models/kirillian/weapons/hoomer_viewmodel.dx90.vtx and b/models/kirillian/weapons/hoomer_viewmodel_v2f.dx90.vtx differ diff --git a/models/kirillian/weapons/hoomer_viewmodel.mdl b/models/kirillian/weapons/hoomer_viewmodel_v2f.mdl similarity index 94% rename from models/kirillian/weapons/hoomer_viewmodel.mdl rename to models/kirillian/weapons/hoomer_viewmodel_v2f.mdl index efdd53c6..8d021ec0 100644 Binary files a/models/kirillian/weapons/hoomer_viewmodel.mdl and b/models/kirillian/weapons/hoomer_viewmodel_v2f.mdl differ diff --git a/models/kirillian/weapons/hoomer_viewmodel.sw.vtx b/models/kirillian/weapons/hoomer_viewmodel_v2f.sw.vtx similarity index 99% rename from models/kirillian/weapons/hoomer_viewmodel.sw.vtx rename to models/kirillian/weapons/hoomer_viewmodel_v2f.sw.vtx index de53ad97..2b230da5 100644 Binary files a/models/kirillian/weapons/hoomer_viewmodel.sw.vtx and b/models/kirillian/weapons/hoomer_viewmodel_v2f.sw.vtx differ diff --git a/models/kirillian/weapons/hoomer_viewmodel.vvd b/models/kirillian/weapons/hoomer_viewmodel_v2f.vvd similarity index 99% rename from models/kirillian/weapons/hoomer_viewmodel.vvd rename to models/kirillian/weapons/hoomer_viewmodel_v2f.vvd index 0f0e9bdf..8051cc95 100644 Binary files a/models/kirillian/weapons/hoomer_viewmodel.vvd and b/models/kirillian/weapons/hoomer_viewmodel_v2f.vvd differ diff --git a/models/kirillian/weapons/scunter_viewmodel.dx80.vtx b/models/kirillian/weapons/scunter_viewmodel_v2f.dx80.vtx similarity index 99% rename from models/kirillian/weapons/scunter_viewmodel.dx80.vtx rename to models/kirillian/weapons/scunter_viewmodel_v2f.dx80.vtx index 005f380f..da6da681 100644 Binary files a/models/kirillian/weapons/scunter_viewmodel.dx80.vtx and b/models/kirillian/weapons/scunter_viewmodel_v2f.dx80.vtx differ diff --git a/models/kirillian/weapons/scunter_viewmodel.dx90.vtx b/models/kirillian/weapons/scunter_viewmodel_v2f.dx90.vtx similarity index 99% rename from models/kirillian/weapons/scunter_viewmodel.dx90.vtx rename to models/kirillian/weapons/scunter_viewmodel_v2f.dx90.vtx index 943af768..44248826 100644 Binary files a/models/kirillian/weapons/scunter_viewmodel.dx90.vtx and b/models/kirillian/weapons/scunter_viewmodel_v2f.dx90.vtx differ diff --git a/models/kirillian/weapons/scunter_viewmodel.mdl b/models/kirillian/weapons/scunter_viewmodel_v2f.mdl similarity index 95% rename from models/kirillian/weapons/scunter_viewmodel.mdl rename to models/kirillian/weapons/scunter_viewmodel_v2f.mdl index ef5d6c34..c360d25e 100644 Binary files a/models/kirillian/weapons/scunter_viewmodel.mdl and b/models/kirillian/weapons/scunter_viewmodel_v2f.mdl differ diff --git a/models/kirillian/weapons/scunter_viewmodel.sw.vtx b/models/kirillian/weapons/scunter_viewmodel_v2f.sw.vtx similarity index 99% rename from models/kirillian/weapons/scunter_viewmodel.sw.vtx rename to models/kirillian/weapons/scunter_viewmodel_v2f.sw.vtx index 87c12875..8dea8e46 100644 Binary files a/models/kirillian/weapons/scunter_viewmodel.sw.vtx and b/models/kirillian/weapons/scunter_viewmodel_v2f.sw.vtx differ diff --git a/models/kirillian/weapons/scunter_viewmodel.vvd b/models/kirillian/weapons/scunter_viewmodel_v2f.vvd similarity index 99% rename from models/kirillian/weapons/scunter_viewmodel.vvd rename to models/kirillian/weapons/scunter_viewmodel_v2f.vvd index 019d50b3..fc403ef1 100644 Binary files a/models/kirillian/weapons/scunter_viewmodel.vvd and b/models/kirillian/weapons/scunter_viewmodel_v2f.vvd differ diff --git a/models/kirillian/weapons/sock_viewmodel.dx80.vtx b/models/kirillian/weapons/sock_viewmodel_v2f.dx80.vtx similarity index 99% rename from models/kirillian/weapons/sock_viewmodel.dx80.vtx rename to models/kirillian/weapons/sock_viewmodel_v2f.dx80.vtx index f318541f..92d478ad 100644 Binary files a/models/kirillian/weapons/sock_viewmodel.dx80.vtx and b/models/kirillian/weapons/sock_viewmodel_v2f.dx80.vtx differ diff --git a/models/kirillian/weapons/sock_viewmodel.dx90.vtx b/models/kirillian/weapons/sock_viewmodel_v2f.dx90.vtx similarity index 99% rename from models/kirillian/weapons/sock_viewmodel.dx90.vtx rename to models/kirillian/weapons/sock_viewmodel_v2f.dx90.vtx index 597d44d8..31d12f60 100644 Binary files a/models/kirillian/weapons/sock_viewmodel.dx90.vtx and b/models/kirillian/weapons/sock_viewmodel_v2f.dx90.vtx differ diff --git a/models/kirillian/weapons/sock_viewmodel.mdl b/models/kirillian/weapons/sock_viewmodel_v2f.mdl similarity index 82% rename from models/kirillian/weapons/sock_viewmodel.mdl rename to models/kirillian/weapons/sock_viewmodel_v2f.mdl index d1b1e1a8..6487142b 100644 Binary files a/models/kirillian/weapons/sock_viewmodel.mdl and b/models/kirillian/weapons/sock_viewmodel_v2f.mdl differ diff --git a/models/kirillian/weapons/sock_viewmodel.sw.vtx b/models/kirillian/weapons/sock_viewmodel_v2f.sw.vtx similarity index 99% rename from models/kirillian/weapons/sock_viewmodel.sw.vtx rename to models/kirillian/weapons/sock_viewmodel_v2f.sw.vtx index 2985c847..7deaf910 100644 Binary files a/models/kirillian/weapons/sock_viewmodel.sw.vtx and b/models/kirillian/weapons/sock_viewmodel_v2f.sw.vtx differ diff --git a/models/kirillian/weapons/sock_viewmodel.vvd b/models/kirillian/weapons/sock_viewmodel_v2f.vvd similarity index 99% rename from models/kirillian/weapons/sock_viewmodel.vvd rename to models/kirillian/weapons/sock_viewmodel_v2f.vvd index 9acf183a..d2b6a0d1 100644 Binary files a/models/kirillian/weapons/sock_viewmodel.vvd and b/models/kirillian/weapons/sock_viewmodel_v2f.vvd differ diff --git a/models/kirillian/weapons/spyro_viewmodel.dx80.vtx b/models/kirillian/weapons/spyro_viewmodel_v2f.dx80.vtx similarity index 99% rename from models/kirillian/weapons/spyro_viewmodel.dx80.vtx rename to models/kirillian/weapons/spyro_viewmodel_v2f.dx80.vtx index 4821834e..2e2c15dc 100644 Binary files a/models/kirillian/weapons/spyro_viewmodel.dx80.vtx and b/models/kirillian/weapons/spyro_viewmodel_v2f.dx80.vtx differ diff --git a/models/kirillian/weapons/spyro_viewmodel.dx90.vtx b/models/kirillian/weapons/spyro_viewmodel_v2f.dx90.vtx similarity index 99% rename from models/kirillian/weapons/spyro_viewmodel.dx90.vtx rename to models/kirillian/weapons/spyro_viewmodel_v2f.dx90.vtx index ff081ef0..a316d32e 100644 Binary files a/models/kirillian/weapons/spyro_viewmodel.dx90.vtx and b/models/kirillian/weapons/spyro_viewmodel_v2f.dx90.vtx differ diff --git a/models/kirillian/weapons/spyro_viewmodel.mdl b/models/kirillian/weapons/spyro_viewmodel_v2f.mdl similarity index 78% rename from models/kirillian/weapons/spyro_viewmodel.mdl rename to models/kirillian/weapons/spyro_viewmodel_v2f.mdl index ed44ecdb..f3a22ee1 100644 Binary files a/models/kirillian/weapons/spyro_viewmodel.mdl and b/models/kirillian/weapons/spyro_viewmodel_v2f.mdl differ diff --git a/models/kirillian/weapons/spyro_viewmodel.sw.vtx b/models/kirillian/weapons/spyro_viewmodel_v2f.sw.vtx similarity index 99% rename from models/kirillian/weapons/spyro_viewmodel.sw.vtx rename to models/kirillian/weapons/spyro_viewmodel_v2f.sw.vtx index daa4bc39..7676a767 100644 Binary files a/models/kirillian/weapons/spyro_viewmodel.sw.vtx and b/models/kirillian/weapons/spyro_viewmodel_v2f.sw.vtx differ diff --git a/models/kirillian/weapons/spyro_viewmodel.vvd b/models/kirillian/weapons/spyro_viewmodel_v2f.vvd similarity index 99% rename from models/kirillian/weapons/spyro_viewmodel.vvd rename to models/kirillian/weapons/spyro_viewmodel_v2f.vvd index d78294c9..57a414ca 100644 Binary files a/models/kirillian/weapons/spyro_viewmodel.vvd and b/models/kirillian/weapons/spyro_viewmodel_v2f.vvd differ diff --git a/models/kirillian/weapons/wank_viewmodel.dx80.vtx b/models/kirillian/weapons/wank_viewmodel_v2f.dx80.vtx similarity index 99% rename from models/kirillian/weapons/wank_viewmodel.dx80.vtx rename to models/kirillian/weapons/wank_viewmodel_v2f.dx80.vtx index 01b53588..0b0bb9b1 100644 Binary files a/models/kirillian/weapons/wank_viewmodel.dx80.vtx and b/models/kirillian/weapons/wank_viewmodel_v2f.dx80.vtx differ diff --git a/models/kirillian/weapons/wank_viewmodel.dx90.vtx b/models/kirillian/weapons/wank_viewmodel_v2f.dx90.vtx similarity index 99% rename from models/kirillian/weapons/wank_viewmodel.dx90.vtx rename to models/kirillian/weapons/wank_viewmodel_v2f.dx90.vtx index 444afef7..edec732a 100644 Binary files a/models/kirillian/weapons/wank_viewmodel.dx90.vtx and b/models/kirillian/weapons/wank_viewmodel_v2f.dx90.vtx differ diff --git a/models/kirillian/weapons/wank_viewmodel.mdl b/models/kirillian/weapons/wank_viewmodel_v2f.mdl similarity index 94% rename from models/kirillian/weapons/wank_viewmodel.mdl rename to models/kirillian/weapons/wank_viewmodel_v2f.mdl index 04255a3c..4e056067 100644 Binary files a/models/kirillian/weapons/wank_viewmodel.mdl and b/models/kirillian/weapons/wank_viewmodel_v2f.mdl differ diff --git a/models/kirillian/weapons/wank_viewmodel.sw.vtx b/models/kirillian/weapons/wank_viewmodel_v2f.sw.vtx similarity index 99% rename from models/kirillian/weapons/wank_viewmodel.sw.vtx rename to models/kirillian/weapons/wank_viewmodel_v2f.sw.vtx index 381b1309..fa4bddb1 100644 Binary files a/models/kirillian/weapons/wank_viewmodel.sw.vtx and b/models/kirillian/weapons/wank_viewmodel_v2f.sw.vtx differ diff --git a/models/kirillian/weapons/wank_viewmodel.vvd b/models/kirillian/weapons/wank_viewmodel_v2f.vvd similarity index 99% rename from models/kirillian/weapons/wank_viewmodel.vvd rename to models/kirillian/weapons/wank_viewmodel_v2f.vvd index 49bb9186..8f9023e3 100644 Binary files a/models/kirillian/weapons/wank_viewmodel.vvd and b/models/kirillian/weapons/wank_viewmodel_v2f.vvd differ