- Joined
- Jan 27, 2007
- Messages
- 948
Hello to everyone and good nights, i have a big trouble here, with my save / load system, it's been made for me but i keep getting a problem, and due to my lack of knowledge, i can't fix it, i have tried and keep failing 
The problem is that it saves only the item in the first slot, the other 5 items get missing once you load the character
if anyone can help me i'll be really grateful!
MANY thanks in advance!!!
The problem is that it saves only the item in the first slot, the other 5 items get missing once you load the character
if anyone can help me i'll be really grateful!
JASS:
function SaveLoad_InitialSetup takes nothing returns nothing
local integer i = 0
local integer j = 0
loop
set udg_SaveLoad_Compress[i + 48] = j
set udg_SaveLoad_Uncompress[i] = i + 48
set j = j + 1
set i = i + 1
exitwhen i >= 10
endloop
set i = 0
loop
set udg_SaveLoad_Compress[i + 97] = j
set udg_SaveLoad_Compress[i + 65] = j + 26
set udg_SaveLoad_Uncompress[i + 10] = i + 97
set udg_SaveLoad_Uncompress[i + 26 + 10] = i + 65
set j = j + 1
set i = i + 1
exitwhen i >= 26
endloop
endfunction
function SaveLoad_Id2CId takes integer n returns integer
local integer i = n / (256 * 256 * 256)
local integer r
set n = n - i * (256 * 256 * 256)
set r = udg_SaveLoad_Compress[i]
set i = n / (256 * 256)
set n = n - i * (256 * 256)
set r = r * 64 + udg_SaveLoad_Compress[i]
set i = n / 256
set r = r * 64 + udg_SaveLoad_Compress[i]
return r * 64 + udg_SaveLoad_Compress[n - i * 256]
endfunction
function SaveLoad_CId2Id takes integer n returns integer
local integer i = n / (64 * 64 * 64)
local integer r
set n = n - i * (64 * 64 * 64)
set r = udg_SaveLoad_Uncompress[i]
set i = n / (64 * 64)
set n = n - i * (64 * 64)
set r = r * 256 + udg_SaveLoad_Uncompress[i]
set i = n / 64
set r = r * 256 + udg_SaveLoad_Uncompress[i]
return r * 256 + udg_SaveLoad_Uncompress[n - i * 64]
endfunction
function SaveLoad_Unit2Integer takes unit u returns integer
local integer i = 0
local integer n = GetUnitTypeId(u)
if udg_SaveLoad_Initialized == false then
set udg_SaveLoad_Initialized = true
call SaveLoad_InitialSetup()
endif
loop
set i = i + 1
exitwhen i > udg_SaveLoad_Heroes_LastIndex
if udg_SaveLoad_Heroes[i] == n then
return i
endif
endloop
return SaveLoad_Id2CId(n)
endfunction
function SaveLoad_Integer2Unit takes integer i returns integer
if udg_SaveLoad_Initialized == false then
set udg_SaveLoad_Initialized = true
call SaveLoad_InitialSetup()
endif
if i <= udg_SaveLoad_Heroes_LastIndex then
return udg_SaveLoad_Heroes[i]
endif
return SaveLoad_CId2Id(i)
endfunction
function SaveLoad_Item2Integer takes item t returns integer
local integer i = 0
local integer n = GetItemTypeId(t)
if udg_SaveLoad_Initialized == false then
set udg_SaveLoad_Initialized = true
call SaveLoad_InitialSetup()
endif
loop
set i = i + 1
exitwhen i > udg_SaveLoad_Items_LastIndex
if udg_SaveLoad_Items[i] == n then
return i
endif
endloop
return SaveLoad_Id2CId(n)
endfunction
function SaveLoad_Integer2Item takes integer i returns integer
if udg_SaveLoad_Initialized == false then
set udg_SaveLoad_Initialized = true
call SaveLoad_InitialSetup()
endif
if i <= udg_SaveLoad_Items_LastIndex then
return udg_SaveLoad_Items[i]
endif
return SaveLoad_CId2Id(i)
endfunction
function SaveLoad_Ability2Integer takes integer a returns integer
local integer i = 0
if udg_SaveLoad_Initialized == false then
set udg_SaveLoad_Initialized = true
call SaveLoad_InitialSetup()
endif
loop
set i = i + 1
exitwhen i > udg_SaveLoad_Abilities_LastIndex
if udg_SaveLoad_Abilities[i] == a then
return i
endif
endloop
return SaveLoad_Id2CId(a)
endfunction
function SaveLoad_Integer2Ability takes integer i returns integer
if udg_SaveLoad_Initialized == false then
set udg_SaveLoad_Initialized = true
call SaveLoad_InitialSetup()
endif
if i <= udg_SaveLoad_Abilities_LastIndex then
return udg_SaveLoad_Abilities[i]
endif
return SaveLoad_CId2Id(i)
endfunction
function SaveLoad_Color takes string s returns string
local integer i = StringLength(s)
local string c
local string r = ""
loop
set i = i - 1
set c = SubString(s,i,i + 1)
if c == "0" or c == "1" or c == "2" or c == "3" or c == "4" or c == "5" or c == "6" or c == "7" or c == "8" or c == "9" then
set r = "|cffffcc00" + c + "|r" + r
elseif c == "-" then
set r = "|cffdddddd-|r" + r
else
set r = c + r
endif
exitwhen i <= 0
endloop
return r
endfunction
function SaveLoad_EncodeChar takes string n returns integer
local integer i = 0
local string s1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
local string s2 = "abcdefghijklmnopqrstuvwxyz"
local string s3 = "0123456789"
loop
if SubString(s1,i,i + 1) == n then
return i
endif
if SubString(s2,i,i + 1) == n then
return i
endif
set i = i + 1
exitwhen i >= 26
endloop
set i = 0
loop
if SubString(s3,i,i + 1) == n then
return i
endif
set i = i + 1
exitwhen i >= 10
endloop
return 0
endfunction
function SaveLoad_EncodeVerify takes string buffer returns integer
local integer i = 0
local integer j = 0
local string name = GetPlayerName(GetTriggerPlayer())
if udg_SaveLoad_UsePlayername == true then
loop
set j = j + SaveLoad_EncodeChar(SubString(name,i,i + 1))
set i = i + 1
exitwhen i >= StringLength(name)
endloop
endif
set i = 0
loop
set j = j + SaveLoad_EncodeChar(SubString(buffer,i,i + 1))
set i = i + 1
exitwhen i >= StringLength(buffer)
endloop
return j
endfunction
function SaveLoad_EncodeValues takes nothing returns string
local integer i
local integer j
local integer k
local integer l
local integer m
local integer CodeLength = StringLength(udg_SaveLoad_Alphabet)
local integer array a
local string buffer = ""
local string c = ""
local integer skip = 0
local integer CONST = 1000000
local string abc = "0123456789"
set i = 0
loop
set i = i + 1
exitwhen i > udg_SaveCount
set buffer = buffer + I2S(udg_Save[i]) + "-"
endloop
set buffer = buffer + I2S(SaveLoad_EncodeVerify(buffer))
if udg_Save[1] == 0 then
set buffer = "-" + buffer
endif
set i = 0
loop
set a[i] = 0
set i = i + 1
exitwhen i >= 100
endloop
set m = 0
set i = 0
loop
set j = 0
loop
set a[j] = a[j] * 11
set j = j + 1
exitwhen j > m
endloop
set l = 0
set c = SubString(buffer,i,i + 1)
loop
exitwhen SubString(abc,l,l + 1) == c
set l = l + 1
exitwhen l > 9
endloop
set a[0] = a[0] + l
set j = 0
loop
set k = a[j] / CONST
set a[j] = a[j] - k * CONST
set a[j + 1] = a[j + 1] + k
set j = j + 1
exitwhen j > m
endloop
if k > 0 then
set m = m + 1
endif
set i = i + 1
exitwhen i >= StringLength(buffer)
endloop
set buffer = ""
loop
exitwhen m < 0
set j = m
loop
exitwhen j <= 0
set k = a[j] / CodeLength
set a[j - 1] = a[j - 1] + (a[j] - k * CodeLength) * CONST
set a[j] = k
set j = j - 1
endloop
set k = a[j] / CodeLength
set i = a[j] - k * CodeLength
set buffer = buffer + SubString(udg_SaveLoad_Alphabet,i,i + 1)
set a[j] = k
if a[m] == 0 then
set m = m - 1
endif
endloop
set i = StringLength(buffer)
set skip = 0
set c = ""
loop
set i = i - 1
set c = c + SubString(buffer,i,i + 1)
set skip = skip + 1
if skip == 4 and i > 0 then
set c = c + "-"
set skip = 0
endif
exitwhen i <= 0
endloop
return c
endfunction
function SaveLoad_DecodeValues takes string s returns boolean
local integer i
local integer j
local integer k
local integer l
local integer SaveCode = 0
local integer m
local integer array a
local string buffer = ""
local integer CodeLength = StringLength(udg_SaveLoad_Alphabet)
local integer skip = -1
local integer CONST = 1000000
local string abc = "0123456789-"
local string c
set i = 0
loop
set a[i] = 0
set i = i + 1
exitwhen i >= 100
endloop
set m = 0
set i = 0
loop
set j = 0
loop
set a[j] = a[j] * CodeLength
set j = j + 1
exitwhen j > m
endloop
set skip = skip + 1
if skip == 4 then
set skip = 0
set i = i + 1
endif
set l = CodeLength
set c = SubString(s,i,i + 1)
loop
set l = l - 1
exitwhen l < 1
exitwhen SubString(udg_SaveLoad_Alphabet,l,l + 1) == c
endloop
set a[0] = a[0] + l
set j = 0
loop
set k = a[j] / CONST
set a[j] = a[j] - k * CONST
set a[j + 1] = a[j + 1] + k
set j = j + 1
exitwhen j > m
endloop
if k > 0 then
set m = m + 1
endif
set i = i + 1
exitwhen i >= StringLength(s)
endloop
loop
exitwhen m < 0
set j = m
loop
exitwhen j <= 0
set k = a[j] / 11
set a[j - 1] = a[j - 1] + (a[j] - k * 11) * CONST
set a[j] = k
set j = j - 1
endloop
set k = a[j] / 11
set i = a[j] - k * 11
set buffer = SubString(abc,i,i + 1) + buffer
set a[j] = k
if a[m] == 0 then
set m = m - 1
endif
endloop
set i = 0
set j = 0
loop
loop
exitwhen i >= StringLength(buffer)
exitwhen i > 0 and SubString(buffer,i,i + 1) == "-" and SubString(buffer,i - 1,i) != "-"
set i = i + 1
endloop
if i < StringLength(buffer) then
set k = i
endif
set SaveCode = SaveCode + 1
set udg_Save[SaveCode] = S2I(SubString(buffer,j,i))
set j = i + 1
set i = i + 1
exitwhen i >= StringLength(buffer)
endloop
set j = SaveLoad_EncodeVerify(SubString(buffer,0,k))
set udg_SaveCount = SaveCode - 1
if j == udg_Save[SaveCode] then
return true
endif
return false
endfunction
function SaveLoad_Encode takes nothing returns string
if udg_SaveLoad_CaseSensitive == false then
set udg_SaveLoad_Alphabet = StringCase(udg_SaveLoad_Alphabet,true)
endif
return SaveLoad_Color(SaveLoad_EncodeValues())
endfunction
function SaveLoad_Decode takes string s returns boolean
if udg_SaveLoad_CaseSensitive == false then
set udg_SaveLoad_Alphabet = StringCase(udg_SaveLoad_Alphabet,true)
set s = StringCase(s,true)
endif
if SaveLoad_DecodeValues(s) then
call DisplayTextToPlayer(GetTriggerPlayer(),0,0,"Decoding sucessful")
return true
endif
call DisplayTextToPlayer(GetTriggerPlayer(),0,0,"Decoding failed")
return false
endfunction
-
SaveLoad Initialization All
-
Events
-
Map initialization
-
-
Conditions
-
Actions
-
-------- List of Heroes --------
-
Set SaveLoad_Heroes[1] = Priest
-
Set SaveLoad_Heroes[2] = Ranger
-
Set SaveLoad_Heroes[3] = Thief
-
Set SaveLoad_Heroes[4] = Warlock
-
Set SaveLoad_Heroes[5] = Warrior
-
Set SaveLoad_Heroes[6] = Wizard
-
-------- Number of Heroes --------
-
Set SaveLoad_Heroes_LastIndex = 5
-
-------- List of Items --------
-
Set SaveLoad_Items[1] = Short Sword
-
Set SaveLoad_Items[2] = Wood Shield
-
Set SaveLoad_Items[3] = Simple Staff
-
Set SaveLoad_Items[4] = Cloth Mantle
-
-------- Number of Items --------
-
Set SaveLoad_Items_LastIndex = 4
-
-------- List of Abilities --------
-
Set SaveLoad_Abilities[1] = Curse
-
Set SaveLoad_Abilities[2] = Death Pulse
-
Set SaveLoad_Abilities[3] = Hell Hands
-
Set SaveLoad_Abilities[4] = Summon Dark Minion
-
Set SaveLoad_Abilities[5] = Malaria
-
Set SaveLoad_Abilities[6] = Celestial Stamina
-
Set SaveLoad_Abilities[7] = Divine Intervention
-
Set SaveLoad_Abilities[8] = Holy Nova
-
Set SaveLoad_Abilities[9] = Punish
-
Set SaveLoad_Abilities[10] = Heal Wounds
-
Set SaveLoad_Abilities[11] = Heroic Strike
-
Set SaveLoad_Abilities[12] = War Lust
-
Set SaveLoad_Abilities[13] = Step Away
-
Set SaveLoad_Abilities[14] = Taunt
-
-------- Number of Abilities --------
-
Set SaveLoad_Abilities_LastIndex = 4
-
-------- These three lines may be changed if needed --------
-
Set SaveLoad_Alphabet = ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
-
Set SaveLoad_CaseSensitive = False
-
Set SaveLoad_UsePlayername = True
-
-------- Required: false --------
-
Set SaveLoad_Initialized = False
-
-------- Leave as is. Used to autocreate variables when copy & pasting to a new map --------
-
Set Code = AceHart
-
Set Save[1] = 0
-
Set SaveCount = 1
-
Set Validate = False
-
Set SaveLoad_Compress[1] = 0
-
Set SaveLoad_Uncompress[1] = 0
-
-
-
SaveLoad Save All
-
Events
-
Player - Player 1 (Red) types a chat message containing -save as An exact match
-
Player - Player 2 (Blue) types a chat message containing -save as An exact match
-
Player - Player 3 (Teal) types a chat message containing -save as An exact match
-
Player - Player 4 (Purple) types a chat message containing -save as An exact match
-
Player - Player 5 (Yellow) types a chat message containing -save as An exact match
-
Player - Player 6 (Orange) types a chat message containing -save as An exact match
-
Player - Player 7 (Green) types a chat message containing -save as An exact match
-
Player - Player 8 (Pink) types a chat message containing -save as An exact match
-
Player - Player 9 (Gray) types a chat message containing -save as An exact match
-
Player - Player 10 (Light Blue) types a chat message containing -save as An exact match
-
-
Conditions
-
Actions
-
-------- Prepare the save array with this player's Hero --------
-
Set SaveCount = 0
-
-------- Player's Gold --------
-
Set SaveCount = (SaveCount + 1)
-
Set Save[SaveCount] = ((Triggering player) Current gold)
-
-------- Take all Heroes --------
-
Set UnitGroup = (Units owned by (Triggering player) matching (((Matching unit) is A Hero) Equal to True))
-
Set SaveCount = (SaveCount + 1)
-
Set Save[SaveCount] = (Number of units in UnitGroup)
-
Unit Group - Pick every unit in UnitGroup and do (Actions)
-
Loop - Actions
-
-------- Save the Hero --------
-
Set SaveCount = (SaveCount + 1)
-
Set TempUnit = (Picked unit)
-
Custom script: set udg_Save[udg_SaveCount] = SaveLoad_Unit2Integer( udg_TempUnit )
-
-------- Hero Experience --------
-
Set SaveCount = (SaveCount + 1)
-
Set Save[SaveCount] = (Hero experience of (Picked unit))
-
-------- Hero Position X --------
-
Set SaveCount = (SaveCount + 1)
-
Set Save[SaveCount] = (Integer((X of (Position of (Picked unit)))))
-
-------- Hero Position Y --------
-
Set SaveCount = (SaveCount + 1)
-
Set Save[SaveCount] = (Integer((Y of (Position of (Picked unit)))))
-
-------- How many items does he carry --------
-
Set SaveCount = (SaveCount + 1)
-
Set Save[SaveCount] = (Number of items carried by (Picked unit))
-
-------- Add all items --------
-
For each (Integer A) from 1 to 6, do (Actions)
-
Loop - Actions
-
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
-
If - Conditions
-
((Item carried by (Picked unit) in slot (Integer A)) is owned) Equal to True
-
-
Then - Actions
-
-------- The actual item --------
-
Set SaveCount = (SaveCount + 1)
-
Set TempItem = (Item carried by (Picked unit) in slot (Integer A))
-
Custom script: set udg_Save[udg_SaveCount] = SaveLoad_Item2Integer( udg_TempItem )
-
-------- The number of charges it has --------
-
Set SaveCount = (SaveCount + 1)
-
Set Save[SaveCount] = (Charges remaining in (Item carried by (Picked unit) in slot (Integer A)))
-
-
Else - Actions
-
-
-
-
-
-
-------- Turn values into code --------
-
Custom script: set udg_Code = SaveLoad_Encode()
-
-------- Show code to player --------
-
Quest - Display to (Player group((Triggering player))) the Secret message: Your code:
-
Game - Display to (Player group((Triggering player))) for 60.00 seconds the text: Code
-
-
-
SaveLoad Load All
-
Events
-
Conditions
-
(Substring((Entered chat string), 1, 6)) Equal to (Matched chat string)
-
(Length of (Entered chat string)) Greater than 6
-
-
Actions
-
-------- Try to decode what was typed --------
-
Set Code = (Substring((Entered chat string), 7, (Length of (Entered chat string))))
-
Custom script: set udg_Validate = SaveLoad_Decode( udg_Code )
-
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
-
If - Conditions
-
Validate Equal to False
-
-
Then - Actions
-
-------- Invalid code --------
-
Game - Display to (Player group((Triggering player))) the text: There's some error ...
-
Skip remaining actions
-
-
Else - Actions
-
-
-------- It worked, let's do something with it --------
-
Unit Group - Pick every unit in (Units owned by (Triggering player) matching (((Matching unit) is A Hero) Equal to True)) and do (Actions)
-
Loop - Actions
-
Unit - Remove (Picked unit) from the game
-
-
-
Set SaveCount = 1
-
-------- Restore Gold --------
-
Player - Set (Triggering player) Current gold to Save[SaveCount]
-
-------- For "number of Heroes", do --------
-
Set SaveCount = (SaveCount + 1)
-
For each (Integer B) from 1 to Save[SaveCount], do (Actions)
-
Loop - Actions
-
-------- Restore Hero --------
-
Set SaveCount = (SaveCount + 1)
-
Custom script: set udg_TempUnitType = SaveLoad_Integer2Unit(udg_Save[udg_SaveCount])
-
Unit - Create 1 TempUnitType for (Triggering player) at (Center of HeroSpawnPoint <gen>) facing Default building facing degrees
-
-------- Set Experience --------
-
Set SaveCount = (SaveCount + 1)
-
Hero - Set (Last created unit) experience to Save[SaveCount], Hide level-up graphics
-
-------- Move to saved position --------
-
Set SaveCount = (SaveCount + 1)
-
Unit - Move (Last created unit) instantly to (Point((Real(Save[SaveCount])), (Real(Save[(SaveCount + 1)]))))
-
Camera - Pan camera for (Triggering player) to (Point((Real(Save[SaveCount])), (Real(Save[(SaveCount + 1)])))) over 0.00 seconds
-
Set SaveCount = (SaveCount + 1)
-
-------- Recreate all items --------
-
Set SaveCount = (SaveCount + 1)
-
For each (Integer A) from 1 to Save[SaveCount], do (Actions)
-
Loop - Actions
-
-------- The actual item --------
-
Set SaveCount = (SaveCount + 1)
-
Custom script: set udg_TempItemType = SaveLoad_Integer2Item(udg_Save[udg_SaveCount])
-
Hero - Create TempItemType and give it to (Last created unit)
-
-------- Number of charges --------
-
Set SaveCount = (SaveCount + 1)
-
Item - Set charges remaining in (Last created item) to Save[SaveCount]
-
-
-
-
-
-
MANY thanks in advance!!!