Strilanc
Veteran Scripter
- Reaction score
- 42
The multiboard BJs create handles, so you shouldn't use them for only the local player. Leaderboard is probably fine.
dammit, but the only thing local on the multiboards is the Title and Display? thats bad? how does dota do it then, it has local Title text as well.
>I have no personal experience as to if using GetOwningPlayer() inside GetLocalPlayer() blocks... worth a try I guess!
well its similar to GetLocalPlayer() == GetTriggerPlayer and that works.
scope KD initializer Init
globals
private integer c = 0
endglobals
struct KDS
//! runtextmacro PUI()
player p
timer t
method onDestroy takes nothing returns nothing
set .p = null
call ReleaseTimer(.t)
set .t = null
endmethod
endstruct
private function Conditions takes nothing returns boolean
return GetUnitPointValue(GetTriggerUnit()) == 100
endfunction
private function Add takes nothing returns nothing
set c = c + Kills[GetPlayerId(GetEnumPlayer())]
endfunction
private function End takes nothing returns nothing
local KDS d = GetCSData(GetExpiredTimer())
set MKCount[GetPlayerId(d.p)] = 0
set KDS[Hero[GetPlayerId(d.p)]] = 0
call d.destroy()
endfunction
private function Actions takes nothing returns nothing
local multiboarditem mbi = null
local integer kid = GetPlayerId(GetOwningPlayer(GetKillingUnit()))
local integer did = GetPlayerId(GetOwningPlayer(GetTriggerUnit()))
local integer bounty = 0
local integer i = 0
local string s
local KDS d = KDS[Hero[kid]]
if (GetPlayerSlotState(GetOwningPlayer(GetTriggerUnit())) == PLAYER_SLOT_STATE_PLAYING or GetPlayerSlotState(GetOwningPlayer(GetTriggerUnit())) == PLAYER_SLOT_STATE_EMPTY) and IsUnitType(GetTriggerUnit(),UNIT_TYPE_HERO) and GetUnitPointValue(GetTriggerUnit()) == 100 then
if GetPlayerSlotState(GetOwningPlayer(GetKillingUnit())) == PLAYER_SLOT_STATE_PLAYING or GetPlayerSlotState(GetOwningPlayer(GetKillingUnit())) == PLAYER_SLOT_STATE_EMPTY then
set Deaths[did] = ( Deaths[did] + 1 )
set TDeaths[did] = ( TDeaths[did] + 1 )
set mbi = MultiboardGetItem(Norm_MB, spots[did], 2)
call MultiboardSetItemValue(mbi, I2S(Deaths[did]) )
call MultiboardReleaseItem(mbi)
set mbi = MultiboardGetItem(Stat_MB[did], 5, 1)
call MultiboardSetItemValue(mbi, I2S(Deaths[did]) )
call MultiboardReleaseItem(mbi)
set mbi = MultiboardGetItem(Stat_MB[did], 7, 1)
call MultiboardSetItemValue(mbi, I2S(TDeaths[did]) )
call MultiboardReleaseItem(mbi)
set Kills[kid] = Kills[kid] + 1
set TKills[kid] = TKills[kid] + 1
set mbi = MultiboardGetItem(Norm_MB, spots[kid], 1)
call MultiboardSetItemValue( mbi, I2S(Kills[kid]) )
call MultiboardReleaseItem(mbi)
set mbi = MultiboardGetItem(Stat_MB[kid], 4, 1)
call MultiboardSetItemValue( mbi, I2S(Kills[kid]) )
call MultiboardReleaseItem(mbi)
set mbi = MultiboardGetItem(Stat_MB[kid], 6, 1)
call MultiboardSetItemValue( mbi, I2S(TKills[kid]) )
call MultiboardReleaseItem(mbi)
if GameMode1[1] == false then
if GameMode1[2] == true then
set i = 1
loop
exitwhen i == 7
set c = 0
call ForForce(Teams<i>, function Add)
set mbi = MultiboardGetItem(Team_MB, i, 1)
call MultiboardSetItemValue( mbi, I2S(c))
call MultiboardReleaseItem(mbi)
set mbi = null
set i = i + 1
endloop
elseif GameMode1[3] == true then
set i = 1
loop
exitwhen i == 5
set c = 0
call ForForce(Teams<i>, function Add)
set mbi = MultiboardGetItem(Team_MB, i, 1)
call MultiboardSetItemValue( mbi, I2S(c))
call MultiboardReleaseItem(mbi)
set mbi = null
set i = i + 1
endloop
elseif GameMode1[4] == true then
set i = 1
loop
exitwhen i == 4
set c = 0
call ForForce(Teams<i>, function Add)
set mbi = MultiboardGetItem(Team_MB, i, 1)
call MultiboardSetItemValue( mbi, I2S(c))
call MultiboardReleaseItem(mbi)
set mbi = null
set i = i + 1
endloop
elseif GameMode1[5] == true then
set i = 1
loop
exitwhen i == 3
set c = 0
call ForForce(Teams<i>, function Add)
set mbi = MultiboardGetItem(Team_MB, i, 1)
call MultiboardSetItemValue( mbi, I2S(c))
call MultiboardReleaseItem(mbi)
set mbi = null
set i = i + 1
endloop
endif
endif
set GameKills = GameKills + 1
if (IsPlayerInForce(GetLocalPlayer(), bj_FORCE_ALL_PLAYERS)) then
call DisplayTextToPlayer(GetLocalPlayer(), 0, 0, PlayerColors[GetPlayerId(GetOwningPlayer(GetDyingUnit()))] + GetPlayerName(GetOwningPlayer(GetDyingUnit())) + "|r" + " has been pwned by " + PlayerColors[GetPlayerId(GetOwningPlayer(GetKillingUnit()))] + GetPlayerName(GetOwningPlayer(GetKillingUnit())) + "|r" + " for " + "|cffffcc00" + "5" + " gold!" + "|r")
endif
call SetPlayerState(GetOwningPlayer(GetKillingUnit()), PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(GetOwningPlayer(GetKillingUnit()), PLAYER_STATE_RESOURCE_GOLD) + 5 )
if GameKills == 1 then
call StartSound( gg_snd_FirstBlood )
if (IsPlayerInForce(GetLocalPlayer(), bj_FORCE_ALL_PLAYERS)) then
call DisplayTextToPlayer(GetLocalPlayer(), 0, 0, PlayerColors[GetPlayerId(GetOwningPlayer(GetKillingUnit()))] + GetPlayerName(GetOwningPlayer(GetKillingUnit())) + "|r" + " has received |c00FF0000FIRST BLOOD!!|r |cffffcc00+5 gold!|r")
endif
call SetPlayerState(GetOwningPlayer(GetKillingUnit()), PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(GetOwningPlayer(GetKillingUnit()), PLAYER_STATE_RESOURCE_GOLD) + 5 )
endif
set s = "|cffffcc00Archer Wars|r " + "|c0000FF00" + I2S(Kills[kid]) + "|r" + "|cffffcc00/|r" + "|c00FF0000" + I2S(Deaths[kid]) + "|r"
if GetLocalPlayer() != GetOwningPlayer(GetKillingUnit()) then
set s = ""
else
call MultiboardSetTitleText(Norm_MB, s)
if Team_MB != null then //do these IF's cause desyncs inside a GetLocalPlayer if?
call MultiboardSetTitleText(Team_MB, s)
endif
set i = 0 //do setting a variable such as i cause desyncs inside a GetLocalPlayer if?
loop
exitwhen i == 12
if Stat_MB<i> != null then
call MultiboardSetTitleText(Stat_MB<i>, s)
endif
set i = i + 1
endloop
endif
set s = "|cffffcc00Archer Wars|r " + "|c0000FF00" + I2S(Kills[did]) + "|r" + "|cffffcc00/|r" + "|c00FF0000" + I2S(Deaths[did]) + "|r"
if GetLocalPlayer() != GetOwningPlayer(GetTriggerUnit()) then
set s = ""
else
call MultiboardSetTitleText(Norm_MB, s)
if Team_MB != null then
call MultiboardSetTitleText(Team_MB, s)
endif
set i = 0
loop
exitwhen i == 12
if Stat_MB<i> != null then
call MultiboardSetTitleText(Stat_MB<i>, s)
endif
set i = i + 1
endloop
endif
if SpreeCount[did] > 3 then
if SpreeCount[did] > 10 then
set SpreeCount[did] = 10
endif
if GodlikeCount[did] > 0 then
set bounty = SpreeEndGold[SpreeCount[did]] + (7 * (GodlikeCount[did] - 1))
else
set bounty = SpreeEndGold[SpreeCount[did]]
endif
if (IsPlayerInForce(GetLocalPlayer(), bj_FORCE_ALL_PLAYERS)) then
call DisplayTextToPlayer( GetLocalPlayer(),0,0, PlayerColors[did] + GetPlayerName(GetOwningPlayer(GetDyingUnit())) + "|r" + "039;s " + SpreeEndAnnounce[SpreeCount[did]] + " has been ended by " + PlayerColors[kid] + GetPlayerName(GetOwningPlayer(GetKillingUnit())) + "|r" + " |cffffcc00+" + I2S(bounty) + " gold!|r" )
endif
call SetPlayerState(GetOwningPlayer(GetKillingUnit()), PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(GetOwningPlayer(GetKillingUnit()), PLAYER_STATE_RESOURCE_GOLD) + bounty )
call DestroyEffect(SpreeSFX[did])
endif
set SpreeCount[did] = 0
set GodlikeCount[did] = 0
set MKCount[did] = 0
set SpreeCount[kid] = SpreeCount[kid] + 1
if SpreeCount[kid] > 10 then
set SpreeCount[kid] = 10
endif
if SpreeCount[kid] > 3 then
call StartSound(SpreeSound[SpreeCount[kid]] )
call SetPlayerState(GetOwningPlayer(GetKillingUnit()), PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(GetOwningPlayer(GetKillingUnit()), PLAYER_STATE_RESOURCE_GOLD) + SpreeGold[SpreeCount[kid]] )
if SpreeCount[kid] == 4 then
set SpreeSFX[kid] = AddSpecialEffectTarget( "Abilities\\Spells\\Items\\HealingSalve\\HealingSalveTarget.mdl", Hero[kid], "origin" )
endif
if SpreeCount[kid] == 10 then
set GodlikeCount[kid] = GodlikeCount[kid] + 1
endif
if GodlikeCount[kid] > 0 then
set bounty = SpreeEndGold[SpreeCount[kid]] + (7 * (GodlikeCount[kid] - 1))
else
set bounty = SpreeEndGold[SpreeCount[kid]]
endif
if IsPlayerInForce(GetLocalPlayer(),bj_FORCE_ALL_PLAYERS) then
call DisplayTimedTextToPlayer( GetLocalPlayer(), 0,0,10.00, PlayerColors[kid] + GetPlayerName(GetOwningPlayer(GetKillingUnit())) + "|r" + SpreeAnnounce[SpreeCount[kid]] + " |cffffcc00(" + I2S(bounty) + " Bounty)|r")
endif
endif
set MKCount[kid] = MKCount[kid] + 1
if d == 0 then
set d = KDS.create()
set d.t = NewTimer()
set d.p = Player(kid)
set KDS[Hero[kid]] = d
call SetCSData(d.t,d)
else
call PauseTimer(d.t)
endif
call TimerStart(d.t,1,false,function End)
if MKCount[kid] > 3 then
set MKCount[kid] = 3
endif
if MKCount[kid] > 1 then
call StartSound(MKSound[MKCount[kid]] )
call SetPlayerState(GetOwningPlayer(GetKillingUnit()), PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(GetOwningPlayer(GetKillingUnit()), PLAYER_STATE_RESOURCE_GOLD) + MKGold[MKCount[kid]] )
if IsPlayerInForce(GetLocalPlayer(),bj_FORCE_ALL_PLAYERS) then
call DisplayTimedTextToPlayer( GetLocalPlayer(), 0,0,10.00, PlayerColors[kid] + GetPlayerName(GetOwningPlayer(GetKillingUnit())) + "|r" + MKAnnounce[MKCount[kid]])
endif
endif
set i = 0
loop
exitwhen i == 12
if TKills[GetPlayerId(GetOwningPlayer(GetKillingUnit()))] == RankKills<i> then
call SetPlayerName( GetOwningPlayer(GetKillingUnit()), ( PlayerName[GetPlayerId(GetOwningPlayer(GetKillingUnit()))] + Rank<i> ) )
if IsPlayerInForce(GetLocalPlayer(), bj_FORCE_ALL_PLAYERS) then
call DisplayTextToPlayer( GetLocalPlayer(),0,0, PlayerColors[GetPlayerId(GetOwningPlayer(GetKillingUnit()))] + PlayerName[GetPlayerId(GetOwningPlayer(GetKillingUnit()))] + "|r has ranked up to a(n)" + "|cffffcc00" + Rank<i> + "|r" )
endif
set mbi = MultiboardGetItem(Stat_MB[GetPlayerId(GetOwningPlayer(GetKillingUnit()))], 1, 1)
call MultiboardSetItemValue(mbi, Rank<i>)
call MultiboardReleaseItem(mbi)
set mbi = null
endif
set i = i + 1
endloop
endif
else
set Deaths[did] = ( Deaths[did] + 1 )
set TDeaths[did] = ( TDeaths[did] + 1 )
set mbi = MultiboardGetItem(Norm_MB, spots[did], 2)
call MultiboardSetItemValue(mbi, I2S(Deaths[did]) )
call MultiboardReleaseItem(mbi)
set mbi = null
if (IsPlayerInForce(GetLocalPlayer(), bj_FORCE_ALL_PLAYERS)) then
call DisplayTextToPlayer(GetLocalPlayer(), 0, 0, PlayerColors[did] + GetPlayerName(GetOwningPlayer(GetDyingUnit())) + "|r" + " has died." )
endif
set s = "|cffffcc00Archer Wars|r " + "|c0000FF00" + I2S(Kills[did]) + "|r" + "|cffffcc00/|r" + "|c00FF0000" + I2S(Deaths[did]) + "|r"
if GetLocalPlayer() != GetOwningPlayer(GetTriggerUnit()) then
set s = ""
else
call MultiboardSetTitleText(Norm_MB, s)
if Team_MB != null then
call MultiboardSetTitleText(Team_MB, s)
endif
set i = 0
loop
exitwhen i == 12
if Stat_MB<i> != null then
call MultiboardSetTitleText(Stat_MB<i>, s)
endif
set i = i + 1
endloop
endif
endif
if DM == true then
call TriggerExecute(DM_Trig[Mode])
endif
set mbi = null
endfunction
//===========================================================================
private function Init takes nothing returns nothing
local trigger trig = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( trig, EVENT_PLAYER_UNIT_DEATH )
call TriggerAddCondition( trig, Condition( function Conditions))
call TriggerAddAction( trig, function Actions )
endfunction
endscope
</i></i></i></i></i></i></i></i></i></i></i></i></i></i>
I don't think variables can be local. Can they?
function LOL takes nothing returns nothng
local string s = "OMG"
if GetLocalPlayer() == GetTriggerPlayer()
set s = "LOLOLOL"
endif
BJDebugMsg(s)
endfunction
scope MB initializer Init
globals
private integer list = 0
endglobals
private function Filter1 takes nothing returns boolean
return GetPlayerSlotState(GetFilterPlayer()) == PLAYER_SLOT_STATE_PLAYING and GetPlayerController(GetFilterPlayer()) == MAP_CONTROL_USER
endfunction
private function Count takes nothing returns nothing
set count = count + 1
endfunction
private function PlayerSet takes nothing returns nothing
local multiboarditem mbi = null
local string s
set spots[GetPlayerId(GetEnumPlayer())] = list
set mbi = MultiboardGetItem(Norm_MB, list, 0)
call MultiboardSetItemValue(mbi, (PlayerColors[GetPlayerId(GetEnumPlayer())] + ( PlayerName[GetPlayerId(GetEnumPlayer())] + "|r" ) ) )
call MultiboardReleaseItem(mbi)
set mbi = MultiboardGetItem(Norm_MB, list, 1)
call MultiboardSetItemValue( mbi, I2S(Kills[GetPlayerId(GetEnumPlayer())]))
call MultiboardReleaseItem(mbi)
set mbi = MultiboardGetItem(Norm_MB, list, 2)
call MultiboardSetItemValue(mbi, I2S(Deaths[GetPlayerId(GetEnumPlayer())]) )
call MultiboardReleaseItem(mbi)
set mbi = null
set s = "|cffffcc00Archer Wars|r |c0000FF00" + I2S(Kills[GetPlayerId(GetEnumPlayer())]) + "|r|cffffcc00/|r|c00FF0000" + I2S(Deaths[GetPlayerId(GetEnumPlayer())]) +"|r"
if GetLocalPlayer() == GetEnumPlayer() then
call MultiboardSetTitleText(Norm_MB, s)
endif
set list = list + 1
endfunction
private function Actions takes nothing returns nothing
local integer c
local integer i
local force f = CreateForce()
local multiboarditem mbi = null
set count = 0
set f = GetPlayersMatching(Condition(function Filter1))
call ForForce(f, function Count)
set c = count
set Norm_MB = CreateMultiboard()
call MultiboardSetColumnCount(Norm_MB, 3)
call MultiboardSetRowCount(Norm_MB, c + 4)
call MultiboardSetTitleText(Norm_MB, "|cffffcc00Archer Wars|r |c0000FF000|r|cffffcc00/|r|c00FF00000|r")
set mbi = MultiboardGetItem(Norm_MB, 0, 0)
call MultiboardSetItemValue( mbi, "|cffffcc00Players|r" )
call MultiboardReleaseItem(mbi)
set mbi = MultiboardGetItem(Norm_MB, 0, 1)
call MultiboardSetItemValue(mbi, "|cffffcc00Kills|r" )
call MultiboardReleaseItem(mbi)
set mbi = MultiboardGetItem(Norm_MB, 0, 2)
call MultiboardSetItemValue( mbi, "|cffffcc00Deaths|r" )
call MultiboardReleaseItem(mbi)
set i = 0
loop
exitwhen i > c + 1
set mbi = MultiboardGetItem(Norm_MB, i, 0)
call MultiboardSetItemStyle( mbi, true, false )
call MultiboardSetItemWidth( mbi, 0.09 )
call MultiboardReleaseItem(mbi)
set mbi = MultiboardGetItem(Norm_MB, i, 1)
call MultiboardSetItemStyle( mbi, true, false )
call MultiboardSetItemWidth( mbi, 0.04 )
call MultiboardReleaseItem(mbi)
set mbi = MultiboardGetItem(Norm_MB, i, 2)
call MultiboardSetItemStyle( mbi, true, false )
call MultiboardSetItemWidth( mbi, 0.04 )
call MultiboardReleaseItem(mbi)
set i = i + 1
endloop
set mbi = MultiboardGetItem(Norm_MB, c+2, 0)
call MultiboardSetItemStyle( mbi, true, false )
call MultiboardSetItemWidth( mbi, 0.19 )
call MultiboardSetItemValue( mbi, "|c0033CCFFPush Right Arrow for Stats|r" )
call MultiboardReleaseItem(mbi)
set mbi = MultiboardGetItem(Norm_MB, c+2, 1)
call MultiboardSetItemStyle( mbi, true, false )
call MultiboardSetItemWidth( mbi, 0.00 )
call MultiboardReleaseItem(mbi)
set mbi = MultiboardGetItem(Norm_MB, c+2, 2)
call MultiboardSetItemStyle( mbi, true, false )
call MultiboardSetItemWidth( mbi, 0.00 )
call MultiboardReleaseItem(mbi)
set mbi = MultiboardGetItem(Norm_MB, c+3, 0)
call MultiboardSetItemStyle( mbi, true, false )
call MultiboardSetItemWidth( mbi, 0.19 )
call MultiboardSetItemValue( mbi, "|c0033CCFFPush Down Arrow for Team|r" )
call MultiboardReleaseItem(mbi)
set mbi = MultiboardGetItem(Norm_MB, c+3, 1)
call MultiboardSetItemStyle( mbi, true, false )
call MultiboardSetItemWidth( mbi, 0.00 )
call MultiboardReleaseItem(mbi)
set mbi = MultiboardGetItem(Norm_MB, c+3, 2)
call MultiboardSetItemStyle( mbi, true, false )
call MultiboardSetItemWidth( mbi, 0.00 )
call MultiboardReleaseItem(mbi)
// SET LIST= Where the FIRST player will be shown, in what ROW he will be placed. in this case it player 1 will be in row 2! If he plays.. if player 1 does not play but player 2 plays, player2 will be put in Row 2! etc!
set list = 1
call ForForce( f, function PlayerSet )
call DestroyForce(f)
call TriggerSleepAction(0.03)
call MultiboardDisplay(Norm_MB,true)
set i = 0
loop
exitwhen i == 12
set CMB<i> = Norm_MB
set i = i + 1
endloop
set f = null
set mbi = null
endfunction
//===========================================================================
private function Init takes nothing returns nothing
local trigger trig = CreateTrigger( )
set MBT = trig
call TriggerAddAction( trig, function Actions )
endfunction
endscope
</i>
scope PlayerLeaves initializer Init
private function Remove takes nothing returns nothing
call RemoveUnit(GetEnumUnit())
endfunction
private function Actions takes nothing returns nothing
local integer i = 1
local group g = NewGroup()
local string s = PlayerColors[GetPlayerId(GetTriggerPlayer())] + PlayerName[GetPlayerId(GetTriggerPlayer())] + " has left the game."
call TriggerSleepAction(0.01)
loop
exitwhen i == 7
call ForceRemovePlayer(Teams<i>, GetTriggerPlayer() )
set i = i + 1
endloop
call KillUnit( Building[GetPlayerId(GetTriggerPlayer())] )
call GroupEnumUnitsOfPlayer(g,GetTriggerPlayer(), null)
call ForGroup(g,function Remove)
call ReleaseGroup(g)
set g = null
if (IsPlayerInForce(GetLocalPlayer(), bj_FORCE_ALL_PLAYERS)) then
call DisplayTextToPlayer(GetLocalPlayer(), 0, 0, s)
endif
call DestroyMultiboard(Stat_MB[GetPlayerId(GetTriggerPlayer())])
set Stat_MB[GetPlayerId(GetTriggerPlayer())] = null
call DestroyMultiboard(Norm_MB)
call TriggerExecute(MBT)
endfunction
//===========================================================================
private function Init takes nothing returns nothing
local trigger trig = CreateTrigger()
call TriggerRegisterPlayerEventLeave( trig, Player(0) )
call TriggerRegisterPlayerEventLeave( trig, Player(1) )
call TriggerRegisterPlayerEventLeave( trig, Player(2) )
call TriggerRegisterPlayerEventLeave( trig, Player(3) )
call TriggerRegisterPlayerEventLeave( trig, Player(4) )
call TriggerRegisterPlayerEventLeave( trig, Player(5) )
call TriggerRegisterPlayerEventLeave( trig, Player(6) )
call TriggerRegisterPlayerEventLeave( trig, Player(7) )
call TriggerRegisterPlayerEventLeave( trig, Player(8) )
call TriggerRegisterPlayerEventLeave( trig, Player(9) )
call TriggerRegisterPlayerEventLeave( trig, Player(10) )
call TriggerRegisterPlayerEventLeave( trig, Player(11) )
call TriggerAddAction( trig, function Actions )
endfunction
endscope
</i>
bump, i would like to know the reasons why a GetLocalPlayer() block would crash ONLY 1 player.
for example, would a desynced string table crash a player?
if GetLocalPlayer() == Player( 1 ) then
// Your local on purpose crash.
call Player( -1 )
endif