- Joined
- Dec 2, 2024
- Messages
- 296
Fight for Freedom
JASS:
function CalculateEquivalentXP takes integer heroLevel, integer victimLevel returns integer
local integer baseXP = 15
local integer xpPerLevelDiff = 5
local integer levelDiff = victimLevel - heroLevel
local integer finalXP = baseXP + (levelDiff * xpPerLevelDiff)
if finalXP < 0 then
return 0
endif
return finalXP
endfunction
function CustomXPSystem_Conditions takes nothing returns boolean
local unit killer = GetKillingUnit()
local unit victim = GetDyingUnit()
local boolean isEnemy = IsUnitEnemy(victim, GetOwningPlayer(killer))
local boolean notStructure = not IsUnitType(victim, UNIT_TYPE_STRUCTURE)
set killer = null
set victim = null
return isEnemy and notStructure
endfunction
function CustomXPSystem_Actions takes nothing returns nothing
local unit killer = GetKillingUnit()
local unit victim = GetDyingUnit()
local player killerOwner = GetOwningPlayer(killer)
local real deadX = GetUnitX(victim)
local real deadY = GetUnitY(victim)
local integer victimLevel = GetUnitLevel(victim)
local integer maxLevel = udg_MaxLevelChapter
local group heroesInRange = CreateGroup()
local unit u
local player uOwner
local integer heroLevel
local integer xpToGive
call GroupEnumUnitsInRange(heroesInRange, deadX, deadY, 1000.0, null)
loop
set u = FirstOfGroup(heroesInRange)
exitwhen u == null
call GroupRemoveUnit(heroesInRange, u)
if IsUnitType(u, UNIT_TYPE_HERO) and GetWidgetLife(u) > 0.405 and IsUnitAlly(u, killerOwner) then
set heroLevel = GetHeroLevel(u)
if heroLevel < maxLevel then
set xpToGive = CalculateEquivalentXP(heroLevel, victimLevel)
if xpToGive > 0 then
set uOwner = GetOwningPlayer(u)
call SetPlayerHandicapXP(uOwner, 1.00)
call AddHeroXP(u, xpToGive, true)
call SetPlayerHandicapXP(uOwner, 0.00)
endif
endif
endif
endloop
call DestroyGroup(heroesInRange)
set killer = null
set victim = null
set killerOwner = null
set heroesInRange = null
set u = null
set uOwner = null
endfunction
function InitTrig_CustomXPSystem takes nothing returns nothing
local trigger t = CreateTrigger()
local integer i = 0
loop
exitwhen i > 23
call SetPlayerHandicapXP(Player(i), 0.00)
set i = i + 1
endloop
call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_DEATH)
call TriggerAddCondition(t, Condition(function CustomXPSystem_Conditions))
call TriggerAddAction(t, function CustomXPSystem_Actions)
endfunction
Is this a good XP script? I made it to manage XP more efficiently instead of having to tweak a thousand different things















