// 특정 무기 장착 시 모든 무기 데미지 업그레이드 (ex_upgrade_click.pop의 *_class_damage_bonus) if ("ClickClassDamage" in getroottable()) return ::ClickClassDamage <- { MARKER = "throwable damage" ITEM_DEFS = { [142] = "The Gunslinger", [237] = "Rocket Jumper", } // 단계당 속성 BONUSES = { ["dmg penalty vs players"] = 0.25, ["dmg bonus vs buildings"] = 0.25, } // 대상 무기의 item num 및 marker 단계 확인 function GetLevel(hPlayer) { for (local i = 0; i < 8; i++) { local hWeapon = NetProps.GetPropEntityArray(hPlayer, "m_hMyWeapons", i) if (hWeapon == null) continue if (!(NetProps.GetPropInt(hWeapon, "m_AttributeManager.m_Item.m_iItemDefinitionIndex") in ITEM_DEFS)) continue local iLevel = hWeapon.GetAttribute(MARKER, 0).tointeger() if (iLevel > 0) return iLevel } return 0 } function Refresh(hPlayer) { if (hPlayer == null || !hPlayer.IsValid() || hPlayer.IsFakeClient()) return local iLevel = GetLevel(hPlayer) foreach (sBonus, flPerLevel in BONUSES) { if (iLevel > 0) hPlayer.AddCustomAttribute(sBonus, 1.0 + flPerLevel * iLevel, -1) else hPlayer.RemoveCustomAttribute(sBonus) } } } ::ClickClassDamageEvents <- { // 리스폰, 보급, 로드아웃·병과 변경 때마다 다시 계산 OnGameEvent_post_inventory_application = function(params) { local hPlayer = GetPlayerFromUserID(params.userid) if (hPlayer == null || hPlayer.IsFakeClient()) return // 업그레이드가 새 무기에 붙는지 확인하므로 딜레이 필요 EntFireByHandle(hPlayer, "RunScriptCode", "ClickClassDamage.Refresh(self)", 0.1, null, null) } } __CollectGameEventCallbacks(ClickClassDamageEvents)