- Joined
- Sep 7, 2008
- Messages
- 320
While i am waiting for Nestharus's File I/O, i have fixed some bug in Data Manager (rewrite some function) but "ReadString" function cause desincs (another people disconnect when play in multi player)
Anyone can help me to fix that
P.s : it work well in single player
Anyone can help me to fix that
P.s : it work well in single player
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])
boolean CheckUserData = true
endglobals
// CODE PART
globals
private integer array DataTrue
private integer SyncSav = 0
private integer SyncInt = 0
private real SyncFlt = 0
private player SyncPlr = null
private string SyncStr = null
private boolean SyncBool = false
private timer t = null
private gamecache SyncCache = InitGameCache("SyncCache")
private gamecache SyncStringCache = InitGameCache("SyncStringCache")
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
if GetLocalPlayer()==SyncPlr then
call Preloader(SAVE_PATH+SyncStr+SAVE_TYPE)
endif
endfunction
function ReadInteger takes integer Offset,player P returns integer
set SyncSav = Offset
set SyncInt = Offset
set SyncPlr = P
set PID = I2S(GetPlayerId(P))
call ExecuteFunc("Execute_ReadInteger")
return GetStoredInteger(SyncCache,I2S(SyncSav),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(SyncSav),PID,SyncInt)
endif
call TriggerSyncStart()
if GetLocalPlayer()==SyncPlr then
call SyncStoredInteger(SyncCache,I2S(SyncSav),PID)
endif
call TriggerSyncReady()
set SyncInt = GetStoredInteger(SyncCache,I2S(SyncSav),PID)
endfunction
function ReadReal takes integer Offset,player P returns real
set SyncSav = Offset
set SyncInt = Offset
set SyncFlt = R2I(Offset)
set SyncPlr = P
set PID = I2S(GetPlayerId(P))
call ExecuteFunc("Execute_ReadReal")
return GetStoredReal(SyncCache,I2S(SyncSav),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(SyncSav),PID,SyncFlt)
endif
call TriggerSyncStart()
if GetLocalPlayer()==SyncPlr then
call SyncStoredReal(SyncCache,I2S(SyncSav),PID)
endif
call TriggerSyncReady()
set SyncFlt = GetStoredReal(SyncCache,I2S(SyncSav),PID)
endfunction
function ConvertString takes string s returns integer
local integer i
local integer k
set i = 1
loop
exitwhen i > StringLength("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-")
if s == SubString("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-", i, i+1) then
set k = i
set i = StringLength("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-")
endif
set i = i + 1
endloop
return k
endfunction
function ConvertNumber takes integer i returns string
local string s
set s = SubString("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-", i, i+1)
return s
endfunction
function ReadString takes integer Offset,player P returns string
set SyncSav = Offset
set SyncInt = Offset
set SyncPlr = P
set PID = I2S(GetPlayerId(P))
call ExecuteFunc("Execute_ReadString")
return GetStoredString(SyncCache,I2S(SyncSav),PID)
endfunction
function Execute_ReadString takes nothing returns nothing
local integer i
local integer k
local string s
if GetLocalPlayer()==SyncPlr then
call StoreString(SyncCache,I2S(SyncSav),PID,STR[SyncInt])
endif
if GetLocalPlayer()==SyncPlr then
set k = StringLength(STR[SyncInt])
call StoreInteger(SyncStringCache,I2S(1),PID,k)
set i = 0
loop
exitwhen i > k
set s = SubString(STR[SyncInt], i, i+1)
call StoreInteger(SyncStringCache,I2S(i+2),PID,ConvertString(s))
set i = i + 1
endloop
endif
call TriggerSyncStart()
if GetLocalPlayer()==SyncPlr then
set i = -1
loop
exitwhen i > k
call SyncStoredInteger(SyncStringCache,I2S(i+2),PID)
set i = i + 1
endloop
endif
call TriggerSyncReady()
set k = GetStoredInteger(SyncStringCache,I2S(1),PID)
set s = ""
set i = 0
loop
exitwhen i > k
set s = s + ConvertNumber(GetStoredInteger(SyncStringCache,I2S(i+1),PID))
set i = i + 1
endloop
call StoreString(SyncCache,I2S(SyncSav),PID,s)
endfunction
function ReadBoolean takes integer Offset,player P returns boolean
set SyncSav = Offset
set SyncInt = Offset
set SyncPlr = P
set PID = I2S(GetPlayerId(P))
call ExecuteFunc("Execute_ReadBoolean")
return GetStoredBoolean(SyncCache,I2S(SyncSav),PID)
endfunction
function Execute_ReadBoolean takes nothing returns nothing
local boolean b=false
if GetLocalPlayer()==SyncPlr then
call StoreBoolean(SyncCache,I2S(SyncSav),PID,IsGameTypeSupported(ConvertGameType(SyncInt)))
endif
call TriggerSyncStart()
if GetLocalPlayer()==SyncPlr then
call SyncStoredBoolean(SyncCache,I2S(SyncSav),PID)
endif
call TriggerSyncReady()
set b=GetStoredBoolean(SyncCache,I2S(SyncSav),PID)
endfunction
endlibrary
JASS:
///Save example
Event : xxx
Action : call CreateData(p)
call AddString(0, codes, p)
call SaveData("save", p)
//Load example
Event : xxx
Action : call LoadData("save",GetTriggerPlayer())
call BJDebugMsg("VALUE = " + ReadString(0,GetTriggerPlayer()))