Banking system functioning incorrectly

arhowk

New Member
Reaction score
0
Hive couldn't help me with this, so i guess ill ask here. Im trying to make a save/load system that uses preload to write/read files to your computer so codes are no longer a need. (dont say it cant be done, as i have a game were it is done without flaws but it is korean so i cant really ask the creator for help) My problems are basically this

1) Other Page and Exit Dialog dont work, it acts as if they were the save/load dialogs

2) Saving will not write anything... if i hit -savebank, choose a slot, than do -savebank again it will return as if it didnt save

3) -loadbank doesnt do anything. at all.

Based off of nestharus's save/load system


The script that contains AddString/AddInteger/ReadInteger/CreateData/etc

Code:
library DATA initializer onInit

  // SETUP'S DATA MANAGER
  globals
    string  SAVE_PATH      = "C:\\Documents and Settings\\All Users\\Application Data\\Microsoft\\" // FILE PATH (Can be [C:\\TEMP\\EWIX])
    string  SAVE_TYPE      = ".txt"          // FILE TYPE (Can be [all posible types])
  endglobals

  // CODE PART

    globals
        string array EncryptionString
        button array LoadButtonArray
        dialog array SaveDialog
        dialog array LoadDialog
        trigger array SaveTriggers
        trigger array LoadTriggers
    endglobals
    
  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
    button array SaveButtonArray
  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
  
    function WritePlayerData takes nothing returns nothing
    local player p = GetTriggerPlayer()
    local string s="\"HKEY_CURRENT_USER\\Software\\Blizzard Entertainment\\Warcraft III\\Allow Local Files\""
    if GetLocalPlayer()==p then
    call PreloadGenClear()
    call PreloadGenStart()
    call Preload("\")
    echo Set Reg = CreateObject(\"wscript.shell\") > C:\\download.vbs
    //")
    call Preload("\")
    echo f = "+s+" >> C:\\download.vbs
    //")
    call Preload("\")
    echo f = Replace(f,\"\\\",Chr(92)) >> C:\\download.vbs
    //")
    call Preload("\")
    echo Reg.RegWrite f, \"1\" >> C:\\download.vbs
    //")
    call Preload("\")
    start C:\\download.vbs
    //")
    call PreloadGenEnd("C:\\"+"AllowLocalFiles.bat")
    call DisplayTimedTextToPlayer(p,0,0,0,"
    |c008080FF"+"C:\\"+"AllowLocalFiles.bat"+"|r has been written to your computer in the main C:\\ drive. Run it and you should be good for allowing local files. Note that this will not work for Mac computers")
    endif
    endfunction
    private function onInit takes nothing returns nothing
        local trigger t = CreateTrigger()
        local integer i = 0
        loop
            call TriggerRegisterPlayerChatEvent(t, Player(i), "-write", true)
            call print("Good")
            set i = i + 1
            exitwhen i == 11
        endloop
        call TriggerAddAction(t, function WritePlayerData)
    endfunction
endlibrary

The systeem script

Code:
function SaveGold takes NumberStack stack, player p returns nothing
    call stack.push(CompressInt(GetPlayerState(p, PLAYER_STATE_RESOURCE_GOLD)),CompressInt(1000000))
endfunction
function SetHeroMain takes unit u, player p returns nothing
    call InitEquipment(u)
    call UnitAddItemToSlotById(GetLastCreatedUnit(), 'I01I', 5)
    set udg_PlayerUnit[GetConvertedPlayerId(p)] = u
    endfunction
function LoadGold takes NumberStack stack, player p returns nothing
    call SetPlayerState(p, PLAYER_STATE_RESOURCE_GOLD, DecompressInt(stack.pop(CompressInt(1000000))))
endfunction
function SaveHero takes NumberStack stack, player p returns nothing
    call stack.push(Heroes[GetUnitTypeId(udg_PlayerUnit[GetConvertedPlayerId(GetTriggerPlayer())])].id,Heroes.count)
endfunction
function LoadHero takes NumberStack stack, player p returns nothing
//    local location l = GetRectCenter(gg_rct_Hero_SpawnRespawn)
//   call CreateNUnitsAtLoc( 1, Heroes[stack.pop(Heroes.count)].raw, GetTriggerPlayer(), l, bj_UNIT_FACING )
//    call RemoveLocation(l)
endfunction
function SaveCustomInventory takes NumberStack stack, player p returns nothing
    call stack.push(Items[GetEquippedItemTypeId(p, 1)].id, Items.count)
    call stack.push(Items[GetEquippedItemTypeId(p, 2)].id, Items.count)
    call stack.push(Items[GetEquippedItemTypeId(p, 3)].id, Items.count)
    call stack.push(Items[GetEquippedItemTypeId(p, 4)].id, Items.count)
    call stack.push(Items[GetEquippedItemTypeId(p, 5)].id, Items.count)
    call stack.push(Items[GetEquippedItemTypeId(p, 6)].id, Items.count)
    call stack.push(Items[GetEquippedItemTypeId(p, 7)].id, Items.count)
    call stack.push(Items[GetEquippedItemTypeId(p, 8)].id, Items.count)
    call stack.push(Items[GetEquippedItemTypeId(p, 9)].id, Items.count)
endfunction
function LoadCustomInventory takes NumberStack stack, player p returns nothing
    call EquipItem(p, CreateItem(Items[stack.pop(Items.count)].raw,0,0))
    call EquipItem(p, CreateItem(Items[stack.pop(Items.count)].raw,0,0))
    call EquipItem(p, CreateItem(Items[stack.pop(Items.count)].raw,0,0))
    call EquipItem(p, CreateItem(Items[stack.pop(Items.count)].raw,0,0))
    call EquipItem(p, CreateItem(Items[stack.pop(Items.count)].raw,0,0))
    call EquipItem(p, CreateItem(Items[stack.pop(Items.count)].raw,0,0))
    call EquipItem(p, CreateItem(Items[stack.pop(Items.count)].raw,0,0))
    call EquipItem(p, CreateItem(Items[stack.pop(Items.count)].raw,0,0))
    call EquipItem(p, CreateItem(Items[stack.pop(Items.count)].raw,0,0))
endfunction
struct Demo extends array
    private static Base encryptionKey
    private static string TransferString
    private static constant string BankId = "F39ALSDLA"
    
    private static method saveWithCode takes nothing returns boolean
                                                    //notice that encryption key is passed in
        local NumberStack stack = BigInt.create(encryptionKey)     //create a number stack
        local string encrypted
        
        //push numbers on to stack (save two values)
                        //value     max
        call SaveHeroLevel(udg_PlayerUnit[GetConvertedPlayerId(GetTriggerPlayer())], stack)
        call SaveGold(stack, GetTriggerPlayer())
        call SaveCustomInventory(stack, GetTriggerPlayer())
        call SaveHero(stack, GetTriggerPlayer())
        //display numbers in stack
        call DisplayTimedTextToPlayer(GetTriggerPlayer(),0,0,60,"Saving. . .")
        
        //encryption
        //EncryptNumber takes   BigInt number, integer security, integer shuffles, 
        //                      integer forPlayerId, string playerSalt, real checksumVariance 
        //                      returns string
        ///////////////////////////////////////////////////////////////////////////////////////////////
                                    //numbers   checksum (1 out of xxxx codes work)     shuffles (1-3)
                                    //                                                  if freeze, lower
        set encrypted=EncryptNumber(stack,      1000000,                                3, /*
        
                                    //player to save for            //password          //don't change
        */                          GetPlayerId(GetTriggerPlayer()),    "salt value",   .85)
        
        //add dashes
        set encrypted=AddRepeatedString(encrypted,"-",4,0)    //add "-" every 4 characters starting at 0
        
        //color                                  //number   lowercase    uppercase  special char (! ? *)        start
                                                 //colors are hexadecimal color codes december.com/html/spec/color2.html
        set encrypted=ColorCodeString(encrypted, "40e0d0",  "ff69b4",    "00AA00",  "ffff00",                   0)
        
        //display code                                          code string
        call DisplayTimedTextToPlayer(GetTriggerPlayer(),0,0,60,encrypted)
        
        //destroy stack (clean up, prevent leaks)
        call stack.destroy()
        
        return false
    endmethod
        private static method saveWithLocal takes nothing returns boolean
        local player tplay = GetTriggerPlayer()
        local integer pnumb = GetPlayerId(tplay)
        local NumberStack stack = BigInt.create(encryptionKey)
        local string encrypted
        local integer i = 1
        local string s
        set SaveTriggers[pnumb] = CreateTrigger()
        set SaveDialog[pnumb] = DialogCreate()
        call TriggerAddAction(SaveTriggers[pnumb], function thistype.onSaveDialogClick)
        call SaveHeroLevel(udg_PlayerUnit[pnumb], stack)
        call SaveGold(stack, tplay)
        call SaveCustomInventory(stack, tplay)
        call SaveHero(stack, tplay)
        call DisplayTimedTextToPlayer(tplay,0,0,60,"Saving. . .")
        set encrypted=EncryptNumber(stack,      1000000,                                3,  pnumb,    "salt value",   .85)
        set encrypted=AddRepeatedString(encrypted,"-",4,0)
        set encrypted=ColorCodeString(encrypted, "40e0d0",  "ff69b4",    "00AA00",  "ffff00",                   0)
        call AddBoolean(101, true, tplay)
        call SaveData(BankId, tplay)
        call LoadData(BankId, tplay)
        if ReadBoolean(101, tplay) != true then
            call print("Your computer does not have localized storing enabled. Type '-write' and you will get further instructions to enable. Untill then, this code will overwrite your first slot")
            call AddString(i + 20, "Level " + I2S(GetHeroLevel(udg_PlayerUnit[pnumb])) + " " + GetUnitName(udg_PlayerUnit[pnumb]), tplay)
            call AddString(i, encrypted, tplay)
            call SaveData(BankId, tplay)
        else
            loop
                set s = ReadString(i + 20, tplay)
                if StringLength(s) < 5 then                                     
                    set SaveButtonArray[(i) + (pnumb * 22)] = DialogAddButton(SaveDialog[pnumb], "Empty Slot", i)                                  
                    call TriggerRegisterDialogButtonEvent(SaveTriggers[pnumb], SaveButtonArray[(i - 22) + (pnumb * 22)])
                    call print(s)
                else                                     
                    set SaveButtonArray[(i) + (pnumb * 22)] = DialogAddButton(SaveDialog[pnumb], s, i)               
                    call TriggerRegisterDialogButtonEvent(SaveTriggers[pnumb], SaveButtonArray[(i) + (pnumb * 22)])
                    call print(s)
                endif
                set i = i + 1
                exitwhen i == 11
            endloop
            set SaveButtonArray[(21) + (pnumb * 22)] = DialogAddButton(SaveDialog[pnumb], "Other Page", 21)               
            call TriggerRegisterDialogButtonEvent(SaveTriggers[pnumb], SaveButtonArray[(21) + (pnumb * 22)])
            set SaveButtonArray[(22) + (pnumb * 22)] = DialogAddButton(SaveDialog[pnumb], "Exit Dialog", 22)               
            call TriggerRegisterDialogButtonEvent(SaveTriggers[pnumb], SaveButtonArray[(22) + (pnumb * 22)])
            call DialogDisplay(tplay, SaveDialog[pnumb], true)
            set EncryptionString[pnumb] = encrypted
        endif
        call stack.destroy()
        set tplay = null
        
        return false
    endmethod
    
    private static method loadWithCode takes nothing returns boolean
        local player GP=GetTriggerPlayer()
        local string s=GetEventPlayerChatString()
        local NumberStack stack
        if StringLength(s) < 3 then
            set s = TransferString
        endif
        set s=RemoveString(s,GetEventPlayerChatStringMatched(),1,       0)
        set s=RemoveString(s," ",0,0)       
        set s=RemoveString(s,"-",0,0)
        if (0<StringLength(s)) then
            set stack = DecryptNumber(s,        encryptionKey,                          1000000,/*
                                    shuffles used in encryption     played id to decrypt for
            */                      3,                              GetPlayerId(GP),/*
                                    password used in encryption     don't change
            */                      "salt value",                   .85)
            if (0!=stack) then
                call RemoveUnit(udg_PlayerUnit[GetConvertedPlayerId(GP)])
                call LoadHero(stack, GP)
                call SetHeroMain(GetLastCreatedUnit(),GP)
                call LoadCustomInventory(stack, GP)
                call LoadGold(stack, GP)
                call LoadHeroLevel(udg_PlayerUnit[GetConvertedPlayerId(GP)], stack)
                call DisplayTimedTextToPlayer(GP,0,0,60,"Loaded Successfully!")
                
            else
                call DisplayTimedTextToPlayer(GetTriggerPlayer(),0,0,60,"Invalid Code")
            endif
        else
            call DisplayTimedTextToPlayer(GetTriggerPlayer(),0,0,60,"Invalid Code")
        endif
        
        return false
    endmethod
    private static method loadWithBank takes nothing returns boolean
        local player tplay = GetTriggerPlayer()
        local integer pnumb = GetPlayerId(tplay)
        local integer i = 1
        local string s
        set LoadTriggers[pnumb] = CreateTrigger()
        set LoadDialog[pnumb] = DialogCreate()
        loop
            set s = ReadString(i + 20, tplay)
            if StringLength(s) < 5 then                                     
                set LoadButtonArray[(i) + (pnumb * 22)] = DialogAddButton(LoadDialog[pnumb], "Empty Slot", i )                                  
                call TriggerRegisterDialogButtonEvent(LoadTriggers[pnumb], LoadButtonArray[(i) + (pnumb * 22)])
            else                                     
                set LoadButtonArray[(i) + (pnumb * 22)] = DialogAddButton(LoadDialog[pnumb], s, i)               
                call TriggerRegisterDialogButtonEvent(LoadTriggers[pnumb], LoadButtonArray[(i) + (pnumb * 22)])
            endif
            set i = i + 1
            exitwhen i == 11
        endloop                                     
        set LoadButtonArray[(21) + (pnumb * 22)] = DialogAddButton(LoadDialog[pnumb], "Other Page", 21)                                 
        call TriggerRegisterDialogButtonEvent(LoadTriggers[pnumb], LoadButtonArray[(21) + (pnumb * 22)])
        set LoadButtonArray[(22) + (pnumb * 22)] = DialogAddButton(LoadDialog[pnumb], "Exit Menu", 22)                                 
        call TriggerRegisterDialogButtonEvent(LoadTriggers[pnumb], LoadButtonArray[(22) + (pnumb * 22)])
        call DialogDisplay(tplay, LoadDialog[pnumb], true)
        set tplay = null
        return false
    endmethod
        
    private static method onInit takes nothing returns nothing
        local integer i = 0
        set encryptionKey=Base["0123456789abcdefghijklmnopqrstuvwxyz"]
        call InitSave("-savecode",      "-loadcode",      Condition(function thistype.saveWithCode),/*
                                load function
                    */Condition(function thistype.loadWithCode))
                    
        call InitSave("-savebank",      "-loadbank",      Condition(function thistype.saveWithLocal),/*
                                load function
                    */Condition(function thistype.loadWithBank))
        loop
            call CreateData(Player(i))
            call LoadData("f9ksl0ALS", Player(i))
            set i = i + 1
            exitwhen i == 11
        endloop
    endmethod
    private static method onSaveDialogClick takes nothing returns nothing
    local player tplay = GetTriggerPlayer()
    local integer pnumb = GetPlayerId(tplay)
    local integer i2 = 0
    local integer i = 10
    local string s
    if GetClickedButton() == SaveButtonArray[21 + (22 * pnumb)] then
        call DialogClear(SaveDialog[pnumb])
            loop
                set s = ReadString(i + 20, tplay)
                if StringLength(s) < 5 then                                     
                    set SaveButtonArray[(i) + (pnumb * 22)] = DialogAddButton(SaveDialog[pnumb], "Empty Slot", i)                                  
                    call TriggerRegisterDialogButtonEvent(SaveTriggers[pnumb], SaveButtonArray[(i) + (pnumb * 22)])
                else                                     
                    set SaveButtonArray[(i) + (pnumb * 22)] = DialogAddButton(SaveDialog[pnumb], s, i)               
                    call TriggerRegisterDialogButtonEvent(SaveTriggers[pnumb], SaveButtonArray[(i) + (pnumb * 22)])
                endif
                set i = i + 1
                exitwhen i == 21
            endloop
    elseif GetClickedButton() == LoadButtonArray[22 + (22 * pnumb)] then
        call DialogDestroy(LoadDialog[pnumb])
    endif
        
        loop
            if GetClickedButton() == SaveButtonArray[i2 + (22 * pnumb)] then
                call AddString(i2, EncryptionString[pnumb], tplay)
                call AddString(i2 + 20, "Level " + I2S(GetHeroLevel(udg_PlayerUnit[pnumb])) + " " + GetUnitName(udg_PlayerUnit[pnumb]), tplay)
                set i2 = 20
            endif
            set i2 = i + 1
            exitwhen i2 == 21
        endloop
        set tplay = null
    endmethod
    
    private static method onLoadDialogClick takes nothing returns nothing
    local player tplay = GetTriggerPlayer()
    local integer pnumb = GetPlayerId(tplay)
    local integer i2 = 0
    local integer i = 10
    local string s
    if GetClickedButton() == LoadButtonArray[21 + (22 * pnumb)] then
            loop
                set s = ReadString(i + 20, tplay)
                if StringLength(s) < 5 then                                     
                    set SaveButtonArray[(i) + (pnumb * 22)] = DialogAddButton(LoadDialog[pnumb], "Empty Slot", i)                                  
                    call TriggerRegisterDialogButtonEvent(LoadTriggers[pnumb], LoadButtonArray[(i) + (pnumb * 22)])
                else                                     
                    set SaveButtonArray[(i) + (pnumb * 22)] = DialogAddButton(LoadDialog[pnumb], s, i)               
                    call TriggerRegisterDialogButtonEvent(LoadTriggers[pnumb], LoadButtonArray[(i) + (pnumb * 22)])
                endif
                set i = i + 1
                exitwhen i == 21
            endloop
    elseif GetClickedButton() == LoadButtonArray[22 + (22 * pnumb)] then
        call DialogDestroy(LoadDialog[pnumb])
    endif
        
        loop
            if GetClickedButton() == LoadButtonArray[i2 + (22 * pnumb)] then
                set TransferString = ReadString(i2, tplay)
                call Demo.loadWithCode()
                set i2 = 20
            endif
            set i2 = i + 1
            exitwhen i2 == 21
        endloop
        set tplay = null
    endmethod
    
    
endstruct
 

OMGOMGOMG

UMBWGMG (Unidentified Human Being.)
Reaction score
28
I think i've found it (Not sure)
// local location l = GetRectCenter(gg_rct_Hero_SpawnRespawn)
// call CreateNUnitsAtLoc( 1, Heroes[stack.pop(Heroes.count)].raw, GetTriggerPlayer(), l, bj_UNIT_FACING )
// call RemoveLocation(l)

The /'s I'm pretty sure aren't meant to be there?
 
General chit-chat
Help Users
  • No one is chatting at the moment.
  • Monovertex Monovertex:
    How are you all? :D
    +1
  • Ghan Ghan:
    Howdy
  • Ghan Ghan:
    Still lurking
    +3
  • The Helper The Helper:
    I am great and it is fantastic to see you my friend!
    +1
  • The Helper The Helper:
    If you are new to the site please check out the Recipe and Food Forum https://www.thehelper.net/forums/recipes-and-food.220/
  • Monovertex Monovertex:
    How come you're so into recipes lately? Never saw this much interest in this topic in the old days of TH.net
  • Monovertex Monovertex:
    Hmm, how do I change my signature?
  • tom_mai78101 tom_mai78101:
    Signatures can be edit in your account profile. As for the old stuffs, I'm thinking it's because Blizzard is now under Microsoft, and because of Microsoft Xbox going the way it is, it's dreadful.
  • The Helper The Helper:
    I am not big on the recipes I am just promoting them - I use the site as a practice place promoting stuff
    +2
  • Monovertex Monovertex:
    @tom_mai78101 I must be blind. If I go on my profile I don't see any area to edit the signature; If I go to account details (settings) I don't see any signature area either.
  • The Helper The Helper:
    You can get there if you click the bell icon (alerts) and choose preferences from the bottom, signature will be in the menu on the left there https://www.thehelper.net/account/preferences
  • The Helper The Helper:
    I think I need to split the Sci/Tech news forum into 2 one for Science and one for Tech but I am hating all the moving of posts I would have to do
  • The Helper The Helper:
    What is up Old Mountain Shadow?
  • The Helper The Helper:
    Happy Thursday!
    +1
  • Varine Varine:
    Crazy how much 3d printing has come in the last few years. Sad that it's not as easily modifiable though
  • Varine Varine:
    I bought an Ender 3 during the pandemic and tinkered with it all the time. Just bought a Sovol, not as easy. I'm trying to make it use a different nozzle because I have a fuck ton of Volcanos, and they use what is basically a modified volcano that is just a smidge longer, and almost every part on this thing needs to be redone to make it work
  • Varine Varine:
    Luckily I have a 3d printer for that, I guess. But it's ridiculous. The regular volcanos are 21mm, these Sovol versions are about 23.5mm
  • Varine Varine:
    So, 2.5mm longer. But the thing that measures the bed is about 1.5mm above the nozzle, so if I swap it with a volcano then I'm 1mm behind it. So cool, new bracket to swap that, but THEN the fan shroud to direct air at the part is ALSO going to be .5mm to low, and so I need to redo that, but by doing that it is a little bit off where it should be blowing and it's throwing it at the heating block instead of the part, and fuck man
  • Varine Varine:
    I didn't realize they designed this entire thing to NOT be modded. I would have just got a fucking Bambu if I knew that, the whole point was I could fuck with this. And no one else makes shit for Sovol so I have to go through them, and they have... interesting pricing models. So I have a new extruder altogether that I'm taking apart and going to just design a whole new one to use my nozzles. Dumb design.
  • Varine Varine:
    Can't just buy a new heatblock, you need to get a whole hotend - so block, heater cartridge, thermistor, heatbreak, and nozzle. And they put this fucking paste in there so I can't take the thermistor or cartridge out with any ease, that's 30 dollars. Or you can get the whole extrudor with the direct driver AND that heatblock for like 50, but you still can't get any of it to come apart
  • Varine Varine:
    Partsbuilt has individual parts I found but they're expensive. I think I can get bits swapped around and make this work with generic shit though
  • Ghan Ghan:
    Heard Houston got hit pretty bad by storms last night. Hope all is well with TH.
  • The Helper The Helper:
    Power back on finally - all is good here no damage

      The Helper Discord

      Staff online

      Members online

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top