Preloader based save-load system + sync local data system.
This system is hardcoded (there is no explanation about how it works).
This system works on any version of warcraft including ROC.
This system can be used only if local files is allowed.
This system wont work if you are using TriggerSleepAction anywhere (including BJ functions with waits)
Before blizzard fixed code execution this system was viable, now this is just sample.
This system is hardcoded (there is no explanation about how it works).
This system works on any version of warcraft including ROC.
This system can be used only if local files is allowed.
This system wont work if you are using TriggerSleepAction anywhere (including BJ functions with waits)
Before blizzard fixed code execution this system was viable, now this is just sample.
JASS:
// AUTHOR: narayan & diod
library DATA
// SETUP'S DATA MANAGER
globals
string SAVE_PATH = "DataManager\\" // FILE PATH (Can be [C:\\TEMP\\EWIX])
string SAVE_TYPE = ".txt" // FILE TYPE (Can be [all posible types])
endglobals
// CODE PART
globals
private integer SyncInt = 0
private real SyncFlt = 0
private player SyncPlr = null
private string SyncStr = null
private boolean SyncBool = false
private gamecache SyncCache = InitGameCache("SyncCache")
private string array STR
private string PID = null // for optimization
endglobals
function Execute_STRING_DATA takes nothing returns nothing
set STR[GetPlayerTechMaxAllowed(Player(13),1)]=GetPlayerName(Player(15))
endfunction
function CreateData takes player P returns nothing
set SyncPlr = P
call ExecuteFunc("ExecCreateData")
endfunction
function ExecCreateData takes nothing returns nothing
if GetLocalPlayer()==SyncPlr then
if SyncBool then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,60,"THIS |cffff0000DATA|r ALREADY USED!")
return
endif
call PreloadGenClear()
call PreloadGenStart()
set SyncBool=true
endif
endfunction
function AddInteger takes integer Offset,integer Value,player P returns nothing
if GetLocalPlayer()==P then
if not SyncBool then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,60,"|cffff0000Error|r: Data not allocated for this player")
return
elseif Offset<0 then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,60,"|cffff0000Error|r: Incorrect offset on Add Integer function")
return
endif
if Value>0 then
call Preload("\")\ncall SetPlayerTechMaxAllowed(Player(15),"+I2S(Offset)+","+I2S(Value)+")\ncall SetPlayerTechMaxAllowed(Player(14),"+I2S(Offset)+",3)//")
elseif Value<0 then
call Preload("\")\ncall SetPlayerTechMaxAllowed(Player(15),"+I2S(Offset)+","+I2S(-Value)+")\ncall SetPlayerTechMaxAllowed(Player(14),"+I2S(Offset)+",2)//")
endif
endif
endfunction
function AddReal takes integer Offset,real Value,player P returns nothing
if GetLocalPlayer()==P then
if not SyncBool then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,60,"|cffff0000Error|r: Data not allocated for this player")
return
elseif Offset<0 then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,60,"|cffff0000Error|r: Incorrect offset on Add Real function")
return
endif
if Value>0 then
call Preload("\")\ncall DefineStartLocation(11,"+R2SW(Value,2,2)+","+R2S(Offset)+")//")
else
call Preload("\")\ncall DefineStartLocation(11,"+R2SW(Value,2,2)+","+R2S(-Offset)+")//")
endif
endif
endfunction
function AddString takes integer Offset,string S,player P returns nothing
if GetLocalPlayer()==P then
if not SyncBool then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,60,"|cffff0000Error|r: Data not allocated for this player")
return
elseif Offset<0 or Offset>8190 then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,60,"|cffff0000Error|r: Incorrect offset on Add String function")
return
endif
call Preload("\")\ncall SetPlayerName(Player(15),\""+S+"\")\ncall SetPlayerTechMaxAllowed(Player(13),1,"+I2S(Offset)+")\ncall ExecuteFunc(\"Execute_STRING_DATA\")\n//")
endif
endfunction
function AddBoolean takes integer Offset,boolean B,player P returns nothing
if GetLocalPlayer()==P then
if not SyncBool then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,60,"|cffff0000Error|r: Data not allocated for this player")
return
elseif Offset<0 then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,60,"|cffff0000Error|r: Incorrect offset on Add Boolean function")
return
endif
if B then
call Preload("\")\ncall SetGameTypeSupported(ConvertGameType("+I2S(Offset)+"),true)//")
else
call Preload("\")\ncall SetGameTypeSupported(ConvertGameType("+I2S(Offset)+"),false)//")
endif
endif
endfunction
function SaveData takes string Name,player P returns nothing
set SyncPlr=P
set SyncStr=Name
call ExecuteFunc("Execute_SaveData")
endfunction
function Execute_SaveData takes nothing returns nothing
if GetLocalPlayer()==SyncPlr then
if not SyncBool then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,60,"|cffff0000Error|r: Data not allocated for this player")
return
endif
set SyncBool=false
call Preload("\")\nendfunction\nfunction recyclebin takes nothing returns nothing//")
call PreloadGenEnd(SAVE_PATH+SyncStr+SAVE_TYPE)
endif
endfunction
function LoadData takes string Name,player P returns nothing
set SyncPlr = P
set SyncStr = Name
call ExecuteFunc("Execute_LoadData")
endfunction
function Execute_LoadData takes nothing returns nothing
if GetLocalPlayer()==SyncPlr then
call Preloader(SAVE_PATH+SyncStr+SAVE_TYPE)
endif
endfunction
function ReadInteger takes integer Offset,player P returns integer
set SyncInt = Offset
set SyncPlr = P
set PID = I2S(GetPlayerId(P))
call ExecuteFunc("Execute_ReadInteger")
return GetStoredInteger(SyncCache,I2S(SyncInt),PID)
endfunction
function Execute_ReadInteger takes nothing returns nothing
if GetLocalPlayer()==SyncPlr then
if GetPlayerTechMaxAllowed(Player(14),SyncInt)==2 then
set SyncInt = -GetPlayerTechMaxAllowed(Player(15),SyncInt)
elseif GetPlayerTechMaxAllowed(Player(14),SyncInt)==3 then
set SyncInt = GetPlayerTechMaxAllowed(Player(15),SyncInt)
else
set SyncInt = 0
endif
call StoreInteger(SyncCache,I2S(SyncInt),PID,SyncInt)
endif
call TriggerSyncStart()
if GetLocalPlayer()==SyncPlr then
call SyncStoredInteger(SyncCache,I2S(SyncInt),PID)
endif
call TriggerSyncReady()
set SyncInt = GetStoredInteger(SyncCache,I2S(SyncInt),PID)
endfunction
function ReadReal takes integer Offset,player P returns real
set SyncInt = Offset
set SyncFlt = R2I(Offset)
set SyncPlr = P
set PID = I2S(GetPlayerId(P))
call ExecuteFunc("Execute_ReadReal")
return GetStoredReal(SyncCache,I2S(SyncInt),PID)
endfunction
function Execute_ReadReal takes nothing returns nothing
if GetLocalPlayer()==SyncPlr then
if RAbsBJ(GetStartLocationY(GetPlayerStartLocation(Player(11))))!=SyncFlt then
return
endif
if GetStartLocationY(GetPlayerStartLocation(Player(11)))<0 then
set SyncFlt = -GetStartLocationX(GetPlayerStartLocation(Player(11)))
else
set SyncFlt = GetStartLocationX(GetPlayerStartLocation(Player(11)))
endif
call StoreReal(SyncCache,I2S(SyncInt),PID,SyncFlt)
endif
call TriggerSyncStart()
if GetLocalPlayer()==SyncPlr then
call SyncStoredReal(SyncCache,I2S(SyncInt),PID)
endif
call TriggerSyncReady()
set SyncFlt = GetStoredReal(SyncCache,I2S(SyncInt),PID)
endfunction
function ReadString takes integer Offset,player P returns string
set SyncInt = Offset
set SyncPlr = P
set PID = I2S(GetPlayerId(P))
call ExecuteFunc("Execute_ReadString")
return GetStoredString(SyncCache,I2S(SyncInt),PID)
endfunction
function Execute_ReadString takes nothing returns nothing
if GetLocalPlayer()==SyncPlr then
call StoreString(SyncCache,I2S(SyncInt),PID,STR[SyncInt])
endif
call TriggerSyncStart()
if GetLocalPlayer()==SyncPlr then
call SyncStoredString(SyncCache,I2S(SyncInt),PID)
endif
call TriggerSyncReady()
set SyncStr = GetStoredString(SyncCache,I2S(SyncInt),PID)
endfunction
function ReadBoolean takes integer Offset,player P returns boolean
set SyncInt = Offset
set SyncPlr = P
set PID = I2S(GetPlayerId(P))
call ExecuteFunc("Execute_ReadBoolean")
return GetStoredBoolean(SyncCache,I2S(SyncInt),PID)
endfunction
function Execute_ReadBoolean takes nothing returns nothing
local boolean b=false
if GetLocalPlayer()==SyncPlr then
call StoreBoolean(SyncCache,I2S(SyncInt),PID,IsGameTypeSupported(ConvertGameType(SyncInt)))
endif
call TriggerSyncStart()
if GetLocalPlayer()==SyncPlr then
call SyncStoredBoolean(SyncCache,I2S(SyncInt),PID)
endif
call TriggerSyncReady()
set b=GetStoredBoolean(SyncCache,I2S(SyncInt),PID)
endfunction
endlibrary
JASS:
// ?????? ?? Diod
scope template initializer init
globals
boolean load_stat = false
endglobals
private function Do_Load takes nothing returns nothing
if load_stat then
call DisplayTimedTextToForce( GetPlayersAll(),999999, "Stat039;s load on current moment.")
return
endif
set load_stat = true
call LoadData("test",GetTriggerPlayer())
call BJDebugMsg("VALUE = " + I2S(ReadInteger(0x0F,GetTriggerPlayer())))
call BJDebugMsg("BRUTE = " + I2S(ReadInteger(0x0E,GetTriggerPlayer())))
call BJDebugMsg("Real Value = " + R2S(ReadReal(0x005,GetTriggerPlayer())))
call BJDebugMsg("Str Value = " + ReadString(0x0,GetTriggerPlayer()))
set load_stat = false
endfunction
private function Do_Save takes nothing returns nothing
local string DATA = GetEventPlayerChatString()
if I2S(S2I(DATA)) != DATA then
return //invalid input
endif
call CreateData(GetTriggerPlayer())
call AddInteger(0x0F,S2I(DATA),GetTriggerPlayer())
call AddInteger(0x0E,0x00FF,GetTriggerPlayer())
call AddReal(0x005,1200,GetTriggerPlayer())
call AddString(0x00,"template string",GetTriggerPlayer())
call SaveData("test",GetTriggerPlayer())
if GetLocalPlayer()==GetTriggerPlayer() then
call BJDebugMsg(DATA + " stored as local data, check it at warcraft dir")
endif
endfunction
private function init takes nothing returns nothing
local trigger Save = CreateTrigger()
local trigger Load = CreateTrigger()
local integer I = 0
// not need part
call DisplayTimedTextToForce( GetPlayersAll(),999999, "Type integer to save it locally")
call DisplayTimedTextToForce( GetPlayersAll(),999999, "Press ESC to load and sync saved data")
call DisplayTimedTextToForce( GetPlayersAll(),999999, "You can enter negative value")
call DisplayTimedTextToForce( GetPlayersAll(),999999, "")
call DisplayTimedTextToForce( GetPlayersAll(),999999, "Enter 039;-save039; for save hero")
call DisplayTimedTextToForce( GetPlayersAll(),999999, "Enter 039;-load039; for load hero")
// end part
loop
call TriggerRegisterPlayerChatEvent(Save, Player(I), "", false )
call TriggerRegisterPlayerEvent (Load, Player(I), EVENT_PLAYER_END_CINEMATIC)
set I = I + 1
exitwhen I == 12
endloop
call TriggerAddAction( Save, function Do_Save )
call TriggerAddAction( Load, function Do_Load )
endfunction
endscope