[System] Local I/O for Single Player!

Thảo luận trong 'World Editor' bắt đầu bởi dh-g, 15/12/12.

  1. dh-g

    dh-g Fire in the hole!

    Tham gia ngày:
    29/8/09
    Bài viết:
    2,654
    Nơi ở:
    Q1 TP.HCM
    Local I/O Single Player

    PHP:
    library LocalIO initializer OnInit/* by Dhguardianes v1.0.8.8 (Single Player!)
    *************************************************************************************
    * _                        _   ___    ___  
    *| |     ___    ___  __ _ | | |_ _|  / _ \ 
    *| |    / _ \  / __|/ _` || |  | |  / | | |
    *| |___| (_) || (__| (_| || |  | |_/| |_| |
    *|_____|\___/  \___|\__,_||_| |___/  \___/ 
    *************************************************************************************
    *
    * Su dung cho viec "ghi" va` "doc" integer(so nguyen) tu tep tin. toi' da tu` 0 > 2147483645!
    * va ai xai thi ghi credit Dhguardianes nhe' xD
    ***************************************************************************************/
    globals
        
    //neu dat true khi vao game! se check all player
        //xem co bat Allow local files chua! neu khong se tao. 1 file reg
        
    private constant boolean CHECK_ALLOW_IN_INIT true //set true thi` luc vao` Init map se lag 1 chut!
        //khi tao ra Allow file bat se ra 1 doan msg thong bao vi tri' file bath
        
    private constant boolean ECHO_WHEN_ALLOW true
        
    //ten thu muc. Save!
        
    private constant string PATH_FILE "GameData" //khuyen nghi!
        //ten thu muc. Local!
        //hay dat ten nay bang ten map cua ban. tranh' lon!
        
    private constant string PATH_FILE2 "MapName"
        
    //ten FORMAT file!
        
    private constant string FILE_FORMAT ".cal" //khuyen nghi!
        //set true khi ReadLocal se integer tra ve se chinh xac 100%
        //neu set true thi se lag them 50% va` an toan` hon!
        
    private constant boolean SAFETY false //false khuyen nghi!
        // gia tri. cam'!!! day la gia' tri. su dung lam null
        //dat gia tri cam' dat cang` cao thi` gia tri. limit se tang theo!
        //vi du 1000 la null thi Read/Write Local bi limit khi toi 999
        
    private constant integer RETURN_NULL 2147483647 //khuyen nghi!
        // vi tri' file enable local!!!
        
    private constant string PATH_FILE_ACTIVE "C:\\!! AllowLocalFiles\\KichHoat.bat"
        
    //khi su dung ReadLocal se tu dong check allow! va` tao ra file bat Allow tai C:\...
        
    private constant boolean CHECK_ALLOW_WHEN_LOAD false //khuyen nghi false!
    endglobals
    /***************************************************************************************
        Local I/O la gi`?
        ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
        Local I/O su dung Ghi va Doc mot tap tin local tu` may tinh' cua nguoi choi! 
        va co the Ghi va Doc tu 0 > 2147483645 integer
        
        Function
        ¯¯¯¯¯¯¯¯
        function WriteLocal takes player p, integer value returns nothing
         - ghi gia tri. integer tu` 0 den 2147483645
         - gia tri khong cho so' am tuc' -1 + hay -0 + v.v.. 
         
        function ReadLocal takes player p returns integer
         - su dung load lai gia tri. integer do' se tra ve so 0 khi gap Local null!
         
        function NewLocal takes player p returns nothing
         - ban can phai call newlocal truoc khi muon' read hay write!
         - day la mo? Index cho Read va Write truoc khi dung`
         
        function CloseLocal takes player p returns nothing
         - sau khi da read va write hay close local
         - neu khong se gap. loi~ ve local!
         
        function IsFoundLocal takes player p returns boolean
         - su dung de kiem tra nguoi` choi do' da~ tao. file local cho no' chua!
         
        function IsAllowLocal takes player p returns boolean
         - su dung kiem tra nguoi choi do' co bat allow local chua!
         
        function WriteAllowLocal takes player p returns nothing
         - ban co the tao file kich hoat Allow Local Files tu nguoi choi ban muon'
        
        function NewLine takes player p returns string
         - ban co the set write hay read tai 1 index nao do' bang cach su dung NewLine
         -vi du muon read so 3
         call NewLocal(Player(0))
         call NewLine(Player(0))
         call NewLine(Player(0))
         call TempInt = ReadLocal(Player(0)) //day se tra ve so 3
         call CloseLocal(Player(0))
         
        Example
        ¯¯¯¯¯¯¯¯
        if IsFoundLocal(Player(0)) == true then
            call NewLocal(Player(0))
            set TempInt = ReadLocal(Player(0)) //tra ve so 1
            set TempInt2 = ReadLocal(Player(0)) //tra ve so 2
            set TempInt3 = ReadLocal(Player(0)) //tra ve so 3
            call CloseLocal(Player(0))
        else
            call NewLocal(Player(0))
            call WriteLocal(Player(0), 1)
            call WriteLocal(Player(0), 2)
            call WriteLocal(Player(0), 3)
            call CloseLocal(Player(0))
        endif
    ************************************************************************************/

        //Xin dung thay doi bat ky dieu gi tai day!!!       
        
    globals
            
    private constant hashtable table InitHashtable()
            private 
    constant integer key 0x1000//table tranh' trung` ten !!!
        
    endglobals
        
        
    //! textmacro StartLocal
        
    call PreloadGenClear()
        
    call PreloadGenStart()
        
    //! endtextmacro
        
        
    function NewLine takes player p returns string
            call SaveInteger
    (tableGetHandleId(p), keyLoadInteger(tableGetHandleId(p), key) + 1)
            return 
    I2S(LoadInteger(tableGetHandleId(p), key))
        
    endfunction
            
        
    function NewLocal takes player p returns nothing
            call SaveBoolean
    (tableGetHandleId(p), keytrue)
        
    endfunction
            
        
    function CloseLocal takes player p returns nothing
            call FlushChildHashtable
    (tableGetHandleId(p))
        
    endfunction
        
        
    private function CheckLocal takes player p returns nothing
            
    //! runtextmacro StartLocal()
            
    call Preload("\")\r\n\tcall SetPlayerName(Player("+I2S(GetPlayerId(p))+"), \"LOCALIO TEST\")\r\n//")
            
    call Preload("\" )\r\nendfunction\r\nfunction AAA takes nothing returns nothing \r\n//")
            
    call PreloadGenEnd("logs\\flag")
        
    endfunction
        
        
    function WriteAllowLocal takes player p returns nothing
            local string LocalString 
    "\\"
            
    //! runtextmacro StartLocal()
            //Special thank Nestharus to this script
            
    call Preload("\")\r\necho Set Reg = CreateObject(\"wscript.shell\") > download.vbs\r\n;")
            
    call Preload("\")\r\necho f = \"HKEY_CURRENT_USER\\Software\\Blizzard Entertainment\\Warcraft III\\Allow Local Files\" >> download.vbs\r\n;")
            
    call Preload("\")\r\necho f = Replace(f,\"\\\",Chr(92)) >> download.vbs\r\n;"//"
            
    call Preload("\")\r\necho Reg.RegWrite f, 1, \"REG_DWORD\" >> download.vbs\r\n;")
            
    call Preload("\")\r\nstart download.vbs\r\n;")
            
            if 
    GetLocalPlayer() == p then
                set LocalString 
    PATH_FILE_ACTIVE
            
    endif
            
            
    call PreloadGenEnd(LocalString)
            if (
    ECHO_WHEN_ALLOWthen
              call DisplayTimedTextToPlayer
    (p0060000"Local I/O: file enable Allow local file has been extract from " PATH_FILE_ACTIVE)
            endif
            
            
    set LocalString null
        endfunction
        
        
    function IsAllowLocal takes player p returns boolean
            local string playerName 
    GetPlayerName(p)
            
            
    call CheckLocal(p)
            
    call Preloader("logs\\flag")
            
            if 
    GetPlayerName(p) != playerName then
                call SetPlayerName
    (pplayerName)
                return 
    true
            
    endif
            return 
    false
        endfunction
        
        
    function WriteLocal takes player pinteger value returns nothing
            local string LocalString
            
            
    if not HaveSavedBoolean(table,GetHandleId(p),keythen
            debug call BJDebugMsg
    (SCOPE_PREFIX "ERROR: cannot write value when dont' NewLocal Function ")
            return
            endif
            
            if 
    value == RETURN_NULL then
                debug call BJDebugMsg
    (SCOPE_PREFIX "ERROR: cannot write value Null (" I2S(RETURN_NULL) + ")")
                return
            elseif 
    value >= (RETURN_NULL 1then
                debug call BJDebugMsg
    (SCOPE_PREFIX "ERROR: cannot write value limited (" I2S(value) + ")")
                return
            elseif 
    value 0 then
                debug call BJDebugMsg
    (SCOPE_PREFIX "ERROR: cannot write value less than 0 (" I2S(value) + ")")
                return
            endif
            
    set LocalString "\\"
            
    //! runtextmacro StartLocal()
            
    call Preload("\" ) 
            call SetPlayerName(GetLocalPlayer(),\""
    +I2S(value)+"\") 
            //"
    )
            
            if 
    GetLocalPlayer() == p then
                set LocalString 
    PATH_FILE "\\" PATH_FILE2 "\\" GetPlayerName(p) + "\\" GetPlayerName(p) +NewLine(p)+ FILE_FORMAT
            
    endif
            
            
    call PreloadGenEnd(LocalString)
            
            
    set LocalString null
        endfunction
        
         
    function ReadLocal takes player p returns integer
            local string name
            local string value
            
            
    if not HaveSavedBoolean(table,GetHandleId(p),keythen
            debug call BJDebugMsg
    (SCOPE_PREFIX "ERROR: cannot read value when dont' NewLocal Function ")
            return 
    0
            
    endif
            
            static if (
    CHECK_ALLOW_WHEN_LOADthen
                
    if not (IsAllowLocal(p)) then
                    call WriteAllowLocal
    (p)
                endif
            endif
            static if (
    SAFETYthen
                set name 
    GetPlayerName(p)
                
    call Preloader(PATH_FILE "\\" PATH_FILE2 "\\" GetPlayerName(p) + "\\" GetPlayerName(p) + NewLine(p) + FILE_FORMAT)
                
    set value GetPlayerName(p)
                
    call SetPlayerName(pname)
            endif
            
            
    set name GetPlayerName(p)
            
    call Preloader(PATH_FILE "\\" PATH_FILE2 "\\" GetPlayerName(p) + "\\" GetPlayerName(p) + NewLine(p) + FILE_FORMAT)
            
    set value GetPlayerName(p)
            
    call SetPlayerName(pname)
            if 
    name==value then
                
    return 0
            
    endif
            
            return 
    S2I(value)
        
    endfunction
        
            
    private function FoundLocal takes player p returns integer
            local string name
            local string value
            set name 
    GetPlayerName(p)
            
    call Preloader(PATH_FILE "\\" PATH_FILE2 "\\" GetPlayerName(p) + "\\" GetPlayerName(p) + "1" FILE_FORMAT)
            
    set value GetPlayerName(p)
            
    call SetPlayerName(pname)
            
            if 
    name==value then
                
    return RETURN_NULL
            
    endif
            
            return 
    S2I(value)
        
    endfunction
        
        
    function IsFoundLocal takes player p returns boolean
            local integer data 
    0
            set data 
    FoundLocal(p)
            if 
    data == RETURN_NULL or not IsAllowLocal(pthen
                
    return false
            
    endif
            return 
    true
        endfunction
        
        
    private function Init takes nothing returns nothing
            local integer i 
    0
            loop
                
    if (GetPlayerSlotState(Player(i))==PLAYER_SLOT_STATE_PLAYINGthen
                    
    if not (IsAllowLocal(Player(i))) then
                        call WriteAllowLocal
    (Player(i))
                    endif
                endif
                
    set i 1
                exitwhen i 
    11
            endloop
        endfunction
            
        
    private function OnInit takes nothing returns nothing
        
            
    static if (CHECK_ALLOW_IN_INITthen
                call TimerStart
    (CreateTimer(), 0false, function Init)
            endif
        
    endfunction
    endlibrary
    Giới thiệu

    đây là một system tận dụng PreLoader làm căn bản tạo ra file input/output. đó cũng là một "cách thức" giúp làm system auto save và autoload, nhưng hiện tại chưa hỗ trợ thêm hệ hống Synchronization Integer và tạm thời ra phiên bản dành riêng cho Single Player!
    Bạn nào muốn làm system auto save và auto load và một cách đơn giản thì dùng system này :D


    Local I/O có thể giúp ghi dữ liệu "số nguyên" và đọc dữ liệu từ file truy xuất tại máy tính người chơi đó! (tức là có thể tạo ra file save trong máy tính đó


    Sử dụng cho việc "ghi" và "đọc" integer(số nguyên) từ 0 đến 2147483645(2 tỷ 1) bằng cách "nhập và truy xuất" file save!



    hiện tại chỉ hỗ trợ phiên bản SinglePlayer và bạn có thể sử dụng system này để tạo một auto save and load trong map như RPG (single player) map Campain v.v.


    bạn sẽ thấy lag 1 vài mini giây trong lúc load file local đấy! đó hok phải lỗi system mà do kỹ thuật của Blizzard! :-??

    nếu bạn đã từng sử dụng qua File I/O thì bạn sẽ thấy rằng system (dành cho newbie hoặc hok có kiến thức preloader) này dễ dàng hơn File I/O

    Trình hàm
    ¯¯¯¯¯¯¯¯
    function WriteLocal takes player p, integer value returns nothing
    phần này sử dụng để ghi dữ liệu từ player
    - ghi giá trị integer từ 0 đến 2147483645 (2 tỷ 1)
    - giá trị không cho số âm tức -1 + hay -0 + v.v..

    function ReadLocal takes player p returns integer
    - sử dụng load lại giá trị integer đó sẽ trả về số 0 khi gặp local null(tức hok có file save)
    function NewLocal takes player p returns nothing
    - bạn cần phải call NewLocal trước khi muốn read hay write!
    - đây là mở đầu index cho local

    function CloseLocal takes player p returns nothing
    - sau khi đã read và write xong hãy đóng index bằng call CloseLocal
    - neu không sẽ gặp lỗi index liên tục :-"

    function IsFoundLocal takes player p returns boolean
    - sử dụng để kiểm tra người chơi đó đã tạo file local cho đó chưa!
    - tức là check có file save chưa :D

    function IsAllowLocal takes player p returns boolean
    - sử dụng kiểm tra người chơi đó có bật Allow Local Files chưa nếu chưa thì tự động 1 file .bat tại C:\! v.v. kichhoat.bat khi chạy file này local files trong registry war3 sẽ tự động bật!

    function WriteAllowLocal takes player p returns nothing
    - bạn có thể tạo file kích hoạt allow local files từ player bạn muốn
    - mà không cần check


    function NewLine takes player p returns string
    - bạn có thể set write hay read tại một index nào đó bằng cách sử dụng NewLine
    -ví dụ muốn lấy data từ index thứ 3 thì call 2 lần NewLine
    call NewLocal(Player(0)) // tạo index
    call NewLine(Player(0)) // vượt index 1
    call NewLine(Player(0))// vượt index 2
    call TempInt = ReadLocal(Player(0)) //trong lúc này sẽ load dc số 3
    call CloseLocal(Player(0)) // đóng index

    NewLine có thể sử dụng cho việc save hay load một giá trị nào đó mà không muốn load tất cả! vì trong lúc load tức cả sẽ gặp lag một thời gian dài(do blizzard)

    cách tận dụng NewLine giúp đỡ lag :D

    [SPOIL]call NewLocal(Player(0))
    set TempInt = ReadLocal(Player(0))//HP lúc này tớ đã đọc giá trị trước đó! (ví dụ đang 120 máu thì TempInt sẽ là 120)
    call CloseLocal(Player(0)


    ví dụ
    TempInt đại biểu giá trị Index 1 được load (đây là load giá trị máu 120)

    phần này check rằng nếu máu Hero không bằng 120 thì trả về Write nếu bằng thì trả về NewLine tức qua index thứ 2

    if TempInt != R2I(GetUnitStateSwap(UNIT_STATE_LIFE, hero)) then
    set TempInt = R2I(GetUnitStateSwap(UNIT_STATE_LIFE, hero))
    call WriteLocal(Player(0),TempInt) //HP
    else
    call NewLine(Player(0))
    endif[/SPOIL]


    Chú ý
    system này có hiệu lực khi bật Allow Local Files

    hiện tại system này chỉ hỗ trợ đúng tiêu chuẩn của I/O và chưa hỗ trợ
    Synchronization Integer nên trong khi test multi player sẽ gặp tình trạng null local vì file truy nhập từ Local sẽ hiển thị theo kiểu GetLocalPlayer tức player bị ảnh hưởng sẽ thấy 1 còn lại thì thấy 0 hết vì sẽ nếu set HP hay set MP thì gặp tình trạng Desync trong lúc LAN <<<
    cách khắc phục "lỗi" đó bằng cách chuyển Local > Global và điều này chỉ có Synchronization Integer thực hiện được :P

    và system này save integer là bằng tiêu chuẩn và không có mã hóa nếu bạn cần bảo mật hay sử dụng một hế thống mã hóa!

    và gửi lời cảm ơn tới!
    Nestharus script Allow Local Files bằng .vbs!

    Download map demo
    Link MF:
    Local IO Single.w3x
     
    raivor thích bài này.
  2. frostwyrm_9x

    frostwyrm_9x Mr & Ms Pac-Man

    Tham gia ngày:
    12/7/09
    Bài viết:
    190
    Nơi ở:
    Warcraft III
    cuối cùng cũng xong rồi à :|, tớ tưởng cậu bỏ rồi chứ ?
     
  3. Meepolisk

    Meepolisk Donkey Kong

    Tham gia ngày:
    8/2/08
    Bài viết:
    336
    mới single player à :|
    tui có down 1 system file IO bên hive, nó save đc string, và dài hơn cái này nhiều
    tiếc là cũng chỉ Single player :@)

    ráng đợi ông dhg làm xong cái save integer multiplayer thôi
     
  4. dh-g

    dh-g Fire in the hole!

    Tham gia ngày:
    29/8/09
    Bài viết:
    2,654
    Nơi ở:
    Q1 TP.HCM
    vì thật ra tớ đã làm cái giới hạn cho nó chỉ có thể lưu trữ từ 0 đến 2 tỷ 1 integer vì về sau nó còn để tương thích với Synchronization Integer system nên con số int đó là chuẩn nhất! cái của nest là ủng hộ single player nhưng đã ra thêm 1 phiên bản hỗ trợ multiplayer nhưng thật ra nó chỉ biết save integer thôi vì không có cách nào lấy

    Local > Preloader > Local > Global dc :-j chỉ có cách sync nhung thật ra là integer từ 0 đến 2 tỷ 1 và bạn có thể xài cách này mã hóa string theo int :-?
    nhưng sẽ tốn chút CPU cho mỗi lân load string :-?
     
  5. Meepolisk

    Meepolisk Donkey Kong

    Tham gia ngày:
    8/2/08
    Bài viết:
    336
    vậy nếu tui có 1 system encrypt và decrypt riệng biệt (nó sẽ encrypt int thành str, và decrypt str thành int)

    liệu có thể tích hợp cả file IO multiplayer và system Encrypt trên, để save string, lấy ra Integer thành global đc k?
     
  6. dh-g

    dh-g Fire in the hole!

    Tham gia ngày:
    29/8/09
    Bài viết:
    2,654
    Nơi ở:
    Q1 TP.HCM
    chỉ cần có 1 system nào giúp lấy integer từ local I/O này ra là dc thôi :-j

    ReadLocal(Player(0)) nó sẽ trả 1 int chỉ cần có Sync là dc ví dụ:

    set TempInt = SyncInteger(ReadLocal(Player(0))) / trả về 123 =)) sau đó
    set TempString = DeCoderInt(TempInt) // trả về abc :-"
     
  7. dh-g

    dh-g Fire in the hole!

    Tham gia ngày:
    29/8/09
    Bài viết:
    2,654
    Nơi ở:
    Q1 TP.HCM
    sau khi sử dụng 3 máy test LAN,Online thì kết quả cũng là...
    trong lúc sync int quá là lâu. nó sẽ dẫn đến việc đồng bộ lâu :-< và sự thật nói rằng sử dụng i/o làm auto save and load là bất khả thi :-<
     
    Chỉnh sửa cuối: 7/8/13
  8. Ice_water

    Ice_water Dragon Quest

    Tham gia ngày:
    11/1/07
    Bài viết:
    1,457
    Xài cái mà ai cũng biết là cái gì đó mà làm :-"
     

Chia sẻ trang này