Topic hỏi đáp về cách làm map | version 9

Thảo luận trong 'World Editor' bắt đầu bởi Tom_Kazansky, 22/3/11.

Trạng thái chủ đề:
Không mở trả lời sau này.
  1. kingghot

    kingghot Mr & Ms Pac-Man

    Tham gia ngày:
    15/4/10
    Bài viết:
    290
    Nơi ở:
    Rach Gia
    Hỏi :

    Ai cho em hỏi một map Thủ liên tục thì cần yếu tố gì để tạo map
     
  2. sukaraki

    sukaraki Donkey Kong

    Tham gia ngày:
    12/5/08
    Bài viết:
    356
    Nơi ở:
    Demonworld
    Yếu tố đầu tiên : Đường đi . 3 lane, 2 lane, 1 lane, hay phân ra nhiều khu vực.
    Ví dụ 3,2,1 lane cố định thì cứ chống hết đợt creep này đến đợt khác, đủ wave thì thắng.
    Phân nhiều khu vực : ban đầu creep ra ở khu này, đẩy lên , phá nhà lính, thì thắng khu đó, creep khu khác bắt đầu ra.... cứ thế.

    Đồ đạc : cho quái rớt random item hay là chỉ rớt tiền , dùng tiền mua hàng trong shop. Điều này quyết định nên xây shop hay ko. Có khi vừa cho random item vừa cho mua đồ shop cũng đc.

    Tướng thì khỏi bàn . tạo càng nhiều map càng hấp dẫn.

    tổng kết :
    Cốt lõi của map thủ liên tục khá đơn giản, chỉ là 1 trigger điều khiển quái ra, trong đó có biến đến wave để xác định wave nào ra quái nào. 1 timer để canh thời gian, hết timer thì tăng biến wave, ra quái mới.
    Mấy thứ hoa lá cành muốn thêm thì cũng đc, mà mục đích của map thủ thì thư giãn là chính, thêm thắt nhiều quá lại gây nhức đầu ra...
     
  3. AngeNac

    AngeNac Youtube Master Race

    Tham gia ngày:
    23/9/07
    Bài viết:
    19
    Nơi ở:
    375/2
    1.Skills
    - Em muốn làm một skill xoáy(giống Blade storm) mà time ngắn thôi(khoảng 5s) rồi dặm xuống gây stun.
    - Một skill hút lại rồi nổ(màu của skill la màu đen)
    - Một skill giống Shock wave nhưng mà đẩy unit ra xa
    - Rồi khi lên một lv nhất định ta sẽ có dc một chiêu mới
    2. Map
    - Có ai bít làm sau đánh con boss thì tự động cánh cửa sau con boss sẽ mở ra không
    - Ai bít chỉnh event biến qua chỗ đánh boss không
     
  4. lifesyle

    lifesyle In memory of Desmond Miles CHAMPION ✧Phantom Assassin✧ Lão Làng GVN

    Tham gia ngày:
    19/4/06
    Bài viết:
    18,420
    Nơi ở:
    ._.
    Cho tớ hỏi cái maelstrom trong dota làm sao để làm orb Chain Lightning của nó , rồi làm sao để làm buff của nó luôn :-? .
    Rồi có map def hero nào basic có sẵn các trigger chỉ cần thay đổi thông số ko :D .
     
  5. DylandKyo

    DylandKyo Donkey Kong

    Tham gia ngày:
    28/10/10
    Bài viết:
    358
    Cho e hỏi hỏi xíu về chỗ này. Đây là Quest Lib của forsakener trên Hive. Em copy về xài. Nhưng khi save map thì nó báo Syntax (Ở đoạn tô đen) Ai bík chỉnh chỗ đó làm sao thì chỉ e với nha. Cả đoạn jass mà chỗ đó lãi lỗi =((=((
    Mã:
    //================================================================================//
    //                 SHADOWFLARE'S DYNAMIC QUEST MAKING SYSTEM
    //                                  v1.0
    //
    //
    //
    //
    //
    //
    //
    //
    //
    //
    //================================================================================//
    library QuestLib initializer Init
    
    globals
    //================================================================================//
    //CONFIGURABLES
    //=============
        private constant string     QUEST_STRING        = "|cff008000"
        private constant string     QUEST_UPDATE        = "QUEST UPDATE:"
        private constant string     QUEST_ACCEPT        = "QUEST ACCEPTED"
        private constant string     QUEST_COMPLETE      = "QUEST COMPLETED"
        private constant string     EXP_COLOR           = "|cffc100c1"
        private constant string     GOLD_COLOR          = "|cffffff00"
        private constant string     REWARD_COLOR        = "|cffffff3c"
        private constant integer    STRING_CAP          = 5
        private constant string     COMPLETE_COLOR      = "|cff808080"
        private constant string     UPDATE_STRING       = " - "
        private constant string     Lr                  = "|r"
        private constant integer    TALK_ID             = 'A000'
        private constant real       UPDATE_DURATION     = 7.0
        private constant integer    MAX_PLAYERS         = 10
        private constant string     NEW_QUEST_AVAILABLE = "war3mapImported\\Green Light.mdx"
        private constant string     QUEST_ACCEPTED      = "war3mapImported\\floating questionmark_v2.mdx"
        private constant string     QUEST_FINISHED      = "Abilities\\Spells\\Other\\Aneu\\AneuCaster.mdl"
        private constant integer    DUMMY_REWARD        = 'h001'
    //ENDCONFIGURABLES
    //================================================================================//
        private integer MAX_QUESTS = 0
        private dialog array GiverMenu[MAX_PLAYERS]
        private button array QButton[12]
        private integer index = 0
        public hashtable q = InitHashtable()
    endglobals
    //================================================================================//
    // Public Functions
    //=================
    function GetQuestIndex takes integer StructName returns integer
        local QuestLib_Quest SN = StructName
        return SN.qindex
    endfunction
    //Ex. call GetQuestIndex(LoadInteger(q, 1, 13))
    //Ex. call GetStartingQuests(GetUnitLevel(bj_lastCreatedUnit), bj_lastCreatedUnit)
    function GetStartingQuests takes unit u returns nothing
        local integer i = 0
        local integer ii = 0
        local string s = NEW_QUEST_AVAILABLE
        local QuestLib_Quest dat
        local Players pdat = LoadInteger(q, GetPlayerId(GetOwningPlayer(u)) , 1)
    
        call DisplayTimedTextToPlayer(GetOwningPlayer(u), 0, 0, UPDATE_DURATION+5.0, QUEST_STRING+"AVAILABLE QUESTS")
        loop
            exitwhen i >= MAX_QUESTS
            set i = i+1
            [B]if pdat.qalert[i] == false then[/B]
                set dat = LoadInteger(q, i, 13)
                if GetHeroLevel(u) >= dat.level then
                    if pdat.qenabled[i] == false then
                        if pdat.qcomplete[i] == false then
                            call DisplayTimedTextToPlayer(GetOwningPlayer(u), 0, 0, UPDATE_DURATION+5.0, GetUnitName(dat.giver)+" has a Quest waiting for you.")
                            set pdat.qalert[i] = true
                                if (GetLocalPlayer() != GetOwningPlayer(u)) then
                                    set s = ""
                                endif
                                set pdat.QuestStatus[i] = AddSpecialEffectTarget(s, dat.giver, "overhead")
                        endif
                    endif
                endif
            endif
        endloop
        set i = 0
    
    endfunction
    
    
    //================================================================================//
    private struct QData
        integer array kills[STRING_CAP]
        integer array items[STRING_CAP]
        integer array count[STRING_CAP]
        boolean complete = false
    endstruct
    
      /* Quest Types:
      Kill Quest    - 1
      Item Quest    - 2
      Travel Quest  - 3
      Event Quest   - 4
      */
    public struct Quest
        boolean     reward      = false
        unit        giver       = null
        integer     qindex      = 0
        integer     level       = 0    
        integer     Qitems      = 0
        integer     ritems      = 0
        integer     exp         = 0
        integer     gold        = 0
        integer     lumber      = 0
        integer     strings     = 0
        string      intro       = ""
        string      info        = ""
        string      complete    = ""
        string      reinfo      = ""
        string      qname       = ""
        string      icon        = ""
        quest       questbox
        button Qbutton
        questitem array Qitem[STRING_CAP]
        integer array rewarditem[12]
        integer array item[STRING_CAP]
        integer array many[STRING_CAP]
        string array name[STRING_CAP]
        integer array type[STRING_CAP]
        string array end[STRING_CAP]
            // Example:
            // call (name).IntQuest(gg_unit_Ntin_0022, 1, "Missing Gears", "")
            // call IntQuest(WhatUnit, WhatLevel, WhatName, WhatIcon)
            //               Unit      Integer    String    String
            // Must Be called before any other functions are called.
    method IntQuest takes unit u, integer i, string s, string c returns nothing
        set this.giver = u
        set this.level = i
        set this.qname = s
        set this.icon = c
        set index = index+1
        set this.qindex = index
        set this.strings = 0
        set MAX_QUESTS = MAX_QUESTS+1
        call CreateQuestBJ( bj_QUESTTYPE_REQ_DISCOVERED, "", "", this.icon )
        set this.questbox = GetLastCreatedQuestBJ()
        call QuestSetEnabled(this.questbox, false)
        call QuestSetTitle(this.questbox, this.qname)
        call SaveInteger(q, this.qindex, 13, this)
    endmethod
    
    //IntQuestItem( 'hpea', 3, "Peasants", 1)
    //              integer integer string  integer
    //          objectid    howmany     name    type
    
    method IntQuestItem takes integer i, integer h, string n, integer t returns nothing
        local string End_String = ""
        if t == 1 then
            set  End_String = " Killed!"
        elseif t == 2 then
            set End_String = " Collected!"
        endif
        set this.strings = this.strings+1
        set this.end[this.strings] = End_String
        set this.item[this.strings] = i
        set this.many[this.strings] = h
        set this.name[this.strings] = n
        set this.type[this.strings] = t
        call CreateQuestItemBJ(this.questbox, I2S(0)+" / "+I2S(this.many[this.strings])+" "+this.name[this.strings] + End_String)
        set this.Qitem[this.strings] = GetLastCreatedQuestItemBJ()
    endmethod
            
            // Example:
            // call (name).AddRItem('I000')
            // call AddRItem(WhatItemType)
            //               integer
    method AddRItem takes integer i returns nothing
        set this.ritems = this.ritems+1
        set this.rewarditem[this.ritems] = i
        set this.reward = true
    endmethod
    
            //Example:
            // call (name).AddReward(150, 50, 0)
            // call AddReward(WhatExp, WhatGold, WhatLumber)
            //                integer  integer   integer
    method AddReward takes integer e, integer g, integer l returns nothing
        set this.exp = e
        set this.gold = g
        set this.lumber = l
    endmethod
    
            //  call (name).IntStrings(/*
            //*/"This is the intro!",/*
            //*/"This is the Info!",/*
            //*/"This is the Complete msg!",/*
            //*/"This is the reinfo!"/*
            //*/)
    method IntStrings takes string a, string b, string c, string d returns nothing
        set this.intro = a
        set this.info = b
        set this.complete = c
        set this.reinfo = d
        call QuestSetDescription(this.questbox, this.reinfo)            
    endmethod
    
    endstruct
      
    private function accept takes nothing returns nothing
        local QuestLib_Quest dat
        local Players pdat = LoadInteger(q, GetPlayerId(GetTriggerPlayer()) , 1)
        local QData qdat
        local integer i = 0
        local integer ii = 0
        local integer iii = 0
        local string s = QUEST_ACCEPTED
        local string ss = NEW_QUEST_AVAILABLE
        local unit rewardu
        loop
        exitwhen i >= MAX_QUESTS
        set i = i+1
            set dat = LoadInteger(q, i, 13)
            if GetClickedButton() == dat.Qbutton then
                if pdat.qcomplete[dat.qindex] == false then
                    if pdat.qenabled[dat.qindex] == false then
                        //Accepting Quest
                        set qdat = QData.create()
                        set pdat.qenabled[dat.qindex] = true
                        call DestroyEffect(pdat.QuestStatus[i])
                        
                        if (GetLocalPlayer() != GetTriggerPlayer()) then
                            set s = ""
                        endif
                        set pdat.QuestStatus[i] = AddSpecialEffectTarget(s, dat.giver, "overhead")
                        
                        loop
                            exitwhen ii > dat.strings
                            set ii = ii + 1
                            set qdat.count[i] = 0
                        endloop
                        set ii = 0
                
                        loop
                            exitwhen ii > MAX_PLAYERS
                            set pdat = LoadInteger(q, ii, 1)
                            if (GetLocalPlayer()==Player(ii) and pdat.qenabled[dat.qindex]==true) then
                                call QuestSetEnabled(dat.questbox, true)
                            endif
                        set ii = ii+1
                        endloop
                        set ii = 0
                
                        set pdat = LoadInteger(q, GetPlayerId(GetTriggerPlayer()) , 1)
                        call DisplayTimedTextToPlayer(GetTriggerPlayer(), 0, 0, UPDATE_DURATION, QUEST_STRING+QUEST_ACCEPT+Lr)
                        call DisplayTimedTextToPlayer(GetTriggerPlayer(), 0, 0, UPDATE_DURATION, "  "+dat.qname+Lr)
                        
                        loop
                        exitwhen iii >= dat.strings
                        set iii = iii+1
                            call DisplayTimedTextToPlayer(GetTriggerPlayer(), 0, 0, UPDATE_DURATION, UPDATE_STRING+I2S(qdat.count[iii])+" / "+I2S(dat.many[iii])+" "+dat.name[iii])
                        endloop
                        set iii = 0
                        call SaveInteger(q, dat.qindex, GetHandleId(pdat.owner), qdat)
                    else
                        //Disbanding Quest
                        call DestroyEffect(pdat.QuestStatus[i])
                        
                        if (GetLocalPlayer() != GetTriggerPlayer()) then
                            set ss = ""
                        endif
                        set pdat.QuestStatus[i] = AddSpecialEffectTarget(ss, dat.giver, "overhead")
                    
                        loop
                        exitwhen ii > MAX_PLAYERS
                            if (GetLocalPlayer()==Player(ii) and pdat.qenabled[dat.qindex]==true) then
                                call QuestSetEnabled(dat.questbox, false)
                            endif
                        set ii = ii+1
                        endloop
                        set ii = 0
                    
                        call DisplayTimedTextToPlayer(GetTriggerPlayer(), 0, 0, UPDATE_DURATION, QUEST_STRING+" QUEST DISBANDED"+Lr)
                        call DisplayTimedTextToPlayer(GetTriggerPlayer(), 0, 0, UPDATE_DURATION, "  "+dat.qname+Lr)
                        set pdat.qenabled[dat.qindex] = false
                        set pdat.qcomplete[dat.qindex] = false
                    endif
                else
                    //Turning in Quest; Rewards
                    set pdat.qenabled[dat.qindex] = false
                    call DestroyEffect(pdat.QuestStatus[i])
                    call DisplayTimedTextToPlayer(GetTriggerPlayer(), 0, 0, UPDATE_DURATION, QUEST_STRING+QUEST_COMPLETE+Lr)
                    call DisplayTimedTextToPlayer(GetTriggerPlayer(), 0, 0, UPDATE_DURATION, "  "+dat.qname+Lr)
                    
                    if dat.gold > 0 then
                        call DisplayTimedTextToPlayer(GetTriggerPlayer(), 0, 0, UPDATE_DURATION, GOLD_COLOR+" + "+ I2S(dat.gold) + " Gold"+Lr)    
                    endif
                    
                    if dat.exp > 0 then
                        call DisplayTimedTextToPlayer(GetTriggerPlayer(), 0, 0, UPDATE_DURATION, EXP_COLOR+" + "+ I2S(dat.exp) + " EXP"+Lr)   
                    endif
                    
                    call AdjustPlayerStateBJ( dat.gold, GetTriggerPlayer(), PLAYER_STATE_RESOURCE_GOLD )
                    call AddHeroXP(pdat.owner, dat.exp, true)
                    
                    loop
                    exitwhen ii > MAX_PLAYERS
                        if (GetLocalPlayer()==Player(ii) and pdat.qenabled[dat.qindex]==false) then
                            call QuestSetEnabled(dat.questbox, false)
                        endif
                    set ii = ii+1
                    endloop
                    set ii = 0
                    
                    //Selecting a reward
                    if dat.reward == true then
                        set rewardu = CreateUnit(GetTriggerPlayer(), DUMMY_REWARD, 0, 0, 0)
                        
                        loop
                        exitwhen ii > dat.ritems
                            call AddItemToStock(rewardu, dat.rewarditem[ii], 1, 1)
                        set ii = ii+1
                        endloop
                        set ii = 0
                        
                        call SelectUnitForPlayerSingle(rewardu, GetTriggerPlayer())
                    endif
                endif
            endif
        endloop
        set i = 0
    endfunction
    
    //Function to accept and turn in Quests
      private function talk takes nothing returns nothing
        local real angle = GetUnitFacing(GetSpellTargetUnit())+180
        local integer i = 0
        local integer ii = 0
        local QuestLib_Quest dat
        local Players pdat = LoadInteger(q, GetPlayerId(GetOwningPlayer(GetSpellAbilityUnit())), 1)
        call DialogClear( GiverMenu[GetPlayerId(GetOwningPlayer(GetSpellAbilityUnit()))] )
        //set GiverMenu[GetPlayerId(GetOwningPlayer(GetTriggerUnit()))] = DialogCreate()
        loop
            exitwhen i >= MAX_QUESTS
            set i = i+1
            set dat = LoadInteger(q, i, 13)
            if dat.giver == GetSpellTargetUnit() then
                if pdat.qenabled[dat.qindex] == false then
                    if pdat.qcomplete[dat.qindex] == false then
                        if GetHeroLevel(pdat.owner) >= dat.level then
                            call DialogAddButtonBJ(GiverMenu[GetPlayerId(GetOwningPlayer(GetTriggerUnit()))], dat.qname)
                            set dat.Qbutton = GetLastCreatedButtonBJ()
                        endif
                   endif
                else
                   if pdat.qcomplete[dat.qindex] == true then
                        call DialogAddButtonBJ(GiverMenu[GetPlayerId(GetOwningPlayer(GetSpellAbilityUnit()))], dat.qname+REWARD_COLOR+" (Reward)"+Lr)
                        set dat.Qbutton = GetLastCreatedButtonBJ()
                    else
                        call DialogAddButtonBJ(GiverMenu[GetPlayerId(GetOwningPlayer(GetSpellAbilityUnit()))], dat.qname+" Disband Quest?")
                        set dat.Qbutton = GetLastCreatedButtonBJ()
                    endif
                endif
            endif
        endloop
        set i = 0
        call DialogAddButtonBJ(GiverMenu[GetPlayerId(GetOwningPlayer(GetTriggerUnit()))], "Cancel")
        call DialogDisplayBJ( true, GiverMenu[GetPlayerId(GetOwningPlayer(GetSpellAbilityUnit()))], GetOwningPlayer(GetSpellAbilityUnit()) )
      endfunction
      
      // DO NOT EDIT!!!
      // Function to Update all data within a Quest
      private function QuestUpdate takes player p, integer object, unit triggerer, integer questtype returns nothing
        local Players pdat = LoadInteger(q, GetPlayerId(p), 1) 
        local QuestLib_Quest dat
        local QData qdat
        local integer i = 0
        local integer ii = 0
        local integer iii = 0
        local integer c = 0
        local string s = QUEST_FINISHED
        loop
            exitwhen i >= MAX_QUESTS
            set i = i+1
            set dat = LoadInteger(q, i, 13)
            set qdat = LoadInteger(q, i, GetHandleId(pdat.owner))
            if pdat.qenabled[i] == true then
            loop
                exitwhen ii >= dat.strings
                set ii = ii + 1
                if dat.item[ii] == object then
                    if (IsPlayerInForce(GetLocalPlayer(), GetForceOfPlayer(p))) then
                        // Use only local code (no net traffic) within this block to avoid desyncs.
                        call ClearTextMessages()
                    endif
                endif
            endloop
            set ii = 0
            endif
        endloop
        set i = 0
     
        
        //Goes Through All Quests
        loop
            exitwhen i >= MAX_QUESTS
            set i = i + 1
            set ii = 0
            set iii = 0
            set c = 0
            if pdat.qenabled[i] == true then
                set dat = LoadInteger(q, i, 13)
                set qdat = LoadInteger(q, i, GetHandleId(pdat.owner))
                 loop
                    exitwhen ii >= dat.strings
                    set ii = ii + 1
                        if dat.item[ii] == object then
                            call DisplayTimedTextToPlayer(p, 0, 0, UPDATE_DURATION, QUEST_STRING+QUEST_UPDATE+Lr)
                            call DisplayTimedTextToPlayer(p, 0, 0, UPDATE_DURATION, "  "+dat.qname)
                        endif
                endloop
                set ii = 0
                loop
                    exitwhen ii >= dat.strings
                    set ii = ii + 1
                    if dat.type[ii] == questtype then
                        if dat.item[ii] == object then
                           call RemoveItem( GetItemOfTypeFromUnitBJ(triggerer, object) )
                            set qdat.count[ii] = qdat.count[ii] + 1
                            if qdat.count[ii] < dat.many[ii] then
                                if (IsPlayerInForce(GetLocalPlayer(), GetForceOfPlayer(p))) then
                                    call QuestItemSetDescription(dat.Qitem[ii], I2S(qdat.count[ii])+" / "+I2S(dat.many[ii])+" "+dat.name[ii] + dat.end[ii])
                                endif
                                call DisplayTimedTextToPlayer(p, 0, 0, UPDATE_DURATION, UPDATE_STRING+I2S(qdat.count[ii])+" / "+I2S(dat.many[ii])+" "+dat.name[ii] + dat.end[ii])
                            else
                                set c = c+1
                                if (IsPlayerInForce(GetLocalPlayer(), GetForceOfPlayer(p))) then
                                    call QuestItemSetDescription(dat.Qitem[ii], COMPLETE_COLOR+I2S(dat.many[ii])+" / "+I2S(dat.many[ii])+" "+dat.name[ii] + dat.end[ii] + " (Complete)"+Lr)
                                endif
                                call DisplayTimedTextToPlayer(p, 0, 0, UPDATE_DURATION, COMPLETE_COLOR+UPDATE_STRING+I2S(dat.many[ii])+" / "+I2S(dat.many[ii])+" "+dat.name[ii] + dat.end[ii] + " (Complete)"+Lr)
                            endif
                        else
                            loop
                                exitwhen iii >= dat.strings
                                set iii = iii+1
                                if dat.item[iii] == object then
                                    if dat.item[iii] != dat.item[ii] then
                                        if qdat.count[ii] < dat.many[ii] then
                                            if (IsPlayerInForce(GetLocalPlayer(), GetForceOfPlayer(p))) then
                                                call QuestItemSetDescription(dat.Qitem[ii], I2S(qdat.count[ii])+" / "+I2S(dat.many[ii])+" "+dat.name[ii] + dat.end[ii])
                                            endif
                                            call DisplayTimedTextToPlayer(p, 0, 0, UPDATE_DURATION, UPDATE_STRING+I2S(qdat.count[ii])+" / "+I2S(dat.many[ii])+" "+dat.name[ii] + dat.end[ii])
                                        else
                                            set c = c+1
                                            if (IsPlayerInForce(GetLocalPlayer(), GetForceOfPlayer(p))) then
                                                call QuestItemSetDescription(dat.Qitem[ii], COMPLETE_COLOR+I2S(dat.many[ii])+" / "+I2S(dat.many[ii])+" "+dat.name[ii] + dat.end[ii] + " (Complete)"+Lr)
                                            endif
                                            call DisplayTimedTextToPlayer(p, 0, 0, UPDATE_DURATION, COMPLETE_COLOR+UPDATE_STRING+I2S(dat.many[ii])+" / "+I2S(dat.many[ii])+" "+dat.name[ii] + dat.end[ii] + " (Complete)"+Lr)
                                        endif 
                                    endif
                                endif
                            endloop
                            set iii = 0
                        endif
                    else
                        loop
                            exitwhen iii >= dat.strings
                            set iii = iii+1
                            if dat.item[iii] == object then
                                if dat.item[iii] != dat.item[ii] then
                                    if qdat.count[ii] < dat.many[ii] then
                                        if (IsPlayerInForce(GetLocalPlayer(), GetForceOfPlayer(p))) then
                                            call QuestItemSetDescription(dat.Qitem[ii], I2S(qdat.count[ii])+" / "+I2S(dat.many[ii])+" "+dat.name[ii] + dat.end[ii])
                                        endif
                                        call DisplayTimedTextToPlayer(p, 0, 0, UPDATE_DURATION, UPDATE_STRING+I2S(qdat.count[ii])+" / "+I2S(dat.many[ii])+" "+dat.name[ii] + dat.end[ii])
                                    else
                                        set c = c+1
                                        if (IsPlayerInForce(GetLocalPlayer(), GetForceOfPlayer(p))) then
                                            call QuestItemSetDescription(dat.Qitem[ii], COMPLETE_COLOR+I2S(dat.many[ii])+" / "+I2S(dat.many[ii])+" "+dat.name[ii] + dat.end[ii] + " (Complete)"+Lr)
                                        endif
                                        call DisplayTimedTextToPlayer(p, 0, 0, UPDATE_DURATION, COMPLETE_COLOR+UPDATE_STRING+I2S(dat.many[ii])+" / "+I2S(dat.many[ii])+" "+dat.name[ii] + dat.end[ii] + " (Complete)"+Lr)
                                    endif 
                                endif
                            endif
                        endloop
                        set iii = 0
                    endif
                endloop
                set ii = 0
                if c == dat.strings then
                    set pdat.qcomplete[dat.qindex] = true
                    if pdat.qcomplete[dat.qindex] == true then
                        call DisplayTimedTextToPlayer(p, 0, 0, UPDATE_DURATION, UPDATE_STRING+"Return to " + GetUnitName(dat.giver))
                        if qdat.complete == false then                            
                            if (IsPlayerInForce(GetLocalPlayer(), GetForceOfPlayer(p))) then
                                call QuestSetCompleted(dat.questbox, true)
                                call StartSound(bj_questCompletedSound)
                                call FlashQuestDialogButton()
                                call QuestSetDescription(dat.questbox, "Return to " + GetUnitName(dat.giver)+" to collect your "+REWARD_COLOR+"Reward!"+Lr)
                                call QuestSetRequired(dat.questbox, false)
                                
                            endif
                            call DestroyEffect(pdat.QuestStatus[i])
                            if (GetLocalPlayer() != GetOwningPlayer(pdat.owner)) then
                                    set s = ""
                                endif
                                set pdat.QuestStatus[i] = AddSpecialEffectTarget(s, dat.giver, "overhead")
                        endif
                        set qdat.complete = true
                    endif
                endif
            endif
        endloop
        set i = 0
               
        
      endfunction
      
      private function UpdateAvailableQuests takes nothing returns nothing
        call GetStartingQuests(GetTriggerUnit())
      endfunction
    
      private function KillDeath takes nothing returns nothing
       call QuestUpdate(GetOwningPlayer(GetKillingUnit()), GetUnitTypeId(GetTriggerUnit()), GetKillingUnit(), 1)
      endfunction
      
      private function ItemAq takes nothing returns nothing
        call QuestUpdate(GetOwningPlayer(GetManipulatingUnit()), GetItemTypeId(GetManipulatedItem()) , GetManipulatingUnit(), 2)
      endfunction
      
      private function cond takes nothing returns boolean
         if ( not ( GetSpellAbilityId() == TALK_ID ) ) then
            return false
        endif
        return true
      endfunction
      
      private function KillCond takes nothing returns boolean
          if ( not ( GetOwningPlayer(GetTriggerUnit()) == Player(PLAYER_NEUTRAL_AGGRESSIVE) ) ) then
            return false
        endif
        return true
      endfunction
      
      private function KillReward takes nothing returns nothing
        if DUMMY_REWARD == GetUnitTypeId(GetTriggerUnit()) then
            call RemoveUnit(GetTriggerUnit())
        endif
      endfunction
      
    private function Init takes nothing returns nothing
        local trigger t = CreateTrigger()
        local integer i = 0
        call TriggerAddAction(t, function talk)
        call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_SPELL_EFFECT)
        call TriggerAddCondition(t, Condition(function cond))
        set t = CreateTrigger()
        call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_DEATH )
        call TriggerAddCondition( t, Condition( function KillCond ) )
        call TriggerAddAction( t, function KillDeath )
        set t = CreateTrigger()
    
        loop
            exitwhen i > MAX_PLAYERS
            set GiverMenu[i] = DialogCreate()
            call TriggerRegisterDialogEventBJ(t, GiverMenu[i])
            set i = i+1
        endloop
        
        call TriggerAddAction(t, function accept)
        set t = CreateTrigger()
        call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_PICKUP_ITEM)
        call TriggerAddAction(t, function ItemAq)
        
        set t = CreateTrigger()
        call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_HERO_LEVEL )
        call TriggerAddAction(t, function UpdateAvailableQuests)
        set t = CreateTrigger()
        call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_SELL_ITEM)
        call TriggerAddAction(t, function KillReward)
    endfunction
    
    endlibrary
    Lỗi được báo là: Line 61: pdat is not of a type that allows. systax
    Pro Jass nào bík thì chỉ e với nha tks nhìu nhìu ;));));));))
     
  6. vuongkkk

    vuongkkk T.E.T.Я.I.S

    Tham gia ngày:
    22/5/10
    Bài viết:
    588
    Nơi ở:
    Hà Nội
    ^
    @DylandKyo: lỗi jass
    Hoặc bạn copy sai hoặc thằng đó bị điên khi dùng 1 cái mà chưa tồn tại. Chỉ có thể nói thế. Bạn tự đối chiếu với nguồn, nếu bạn cop không sai nghĩa thằng kia điên :-ss


    Hồi trước có bạn bị lỗi khi ra 1 skill thì nó lại dùng 1 skill khác thì cho mình đính chính nguyên nhân là do base skill từ cùng 1 skill dùng trong cùng 1 thằng tướng. Kể cả có làm order string khác đi thì spell vẫn bị lẫn lộn nên tốt nhất là base từ skill khác hoặc dùng skill fake + dummy skill thật nhé, chỉ đổi oder string thì ko được đâu
     
  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
    cho mình hỏi 1 chút.

    ví dụ Player 1 chọn con Tauren "Hero" thì hiện 1 Icon con Taurent trên màn hình bên trái.
    vậy Player 2 chọn con Demon Hunter "Hero" thì hiện 1 Icon con Demon Hunter bên màn hình bên trái.
    vậy có cách nào để Icon con Demon Hunter "Hero" hiển thị trong Player 1 tức là Player 1 có 2 Icon 1 con là Tauren của mình 1 con là Demon hunter của thằng Player 2 "nhớ rằng 2 player điều là đồng minh"
    trong khi đó nếu player 1 bấm F2 tức là select con Hero của player 2 thì Camera sẽ dc Order theo Player 2 co hero đó' " mà không điều khiển dc "

    có thể giải quyết bằng vụ share full control unis mà mình không muốn có điều đó.
     
  8. YAN[asian]

    YAN[asian] Mario & Luigi

    Tham gia ngày:
    27/3/07
    Bài viết:
    812
    Có lẽ bây giờ như này : Khi Player 2 chọn DH thì tạo cho Player 1 một Hero DH "giả", có thể hide hoặc add locust, mục đích để có cái icon. Khi select Hero giả, lập tức pan camera đến vị trí của DH "thật". Đấy là cách của mình, còn người khác thế nào :)?
     
  9. KuKulKan

    KuKulKan T.E.T.Я.I.S

    Tham gia ngày:
    2/8/09
    Bài viết:
    629
    Nơi ở:
    Quận Thủ Đức, Thành phố Hồ Chí Minh
    That's right :D...Chỉ có thêm vấn đề là khi Hero P2 mất máu hoặc mana, hoặc chết thì...icon bên P1 cũng phải thể hiện giống vậy...

    Mà làm vậy để làm gì thế dhg :-/
     
  10. raivor

    raivor Dragon Quest Lão Làng GVN

    Tham gia ngày:
    24/7/09
    Bài viết:
    1,411
    Mã:
    Player - For Player 2 (Blue), turn Full shared units On toward Player 1 (Red)
    nó đây :-bd.
     
    dh-g thích bài này.
  11. YAN[asian]

    YAN[asian] Mario & Luigi

    Tham gia ngày:
    27/3/07
    Bài viết:
    812
    Yeah, đây .
     
  12. comangdin

    comangdin Mr & Ms Pac-Man

    Tham gia ngày:
    14/9/08
    Bài viết:
    120
    Nơi ở:
    Mars
    ai cho mình xin 1 cái demo về map hero defense đi ,đang kẹt vụ nhà mua hero giống trong dota

    1 hero có 2 skill cùng base từ 1 skill sẽ lỗi .vậy 2 hero mỗi thằng có 1 skill cùng base từ 1 skill thì có sảy ra lỗi không
     
  13. YAN[asian]

    YAN[asian] Mario & Luigi

    Tham gia ngày:
    27/3/07
    Bài viết:
    812
  14. kingghot

    kingghot Mr & Ms Pac-Man

    Tham gia ngày:
    15/4/10
    Bài viết:
    290
    Nơi ở:
    Rach Gia
    Hỏi :

    1/ Làm sao để item tới khu đó sẽ biến mất và đội đó xuất hiến bản thông báo : +1 điểm
    2/ Làm sao làm bản kill theo thời gian ( team 1 thắng 1 lần thì team 1 được +1 - ngược lại )
    3/ Làm sao để lên lv thì có skills biến hình
    4/ Làm sao khi skills có rùi biến thàng skills khác ( như câu 3 nhưng SKills sẽ khác )
     
  15. kindsitinh

    kindsitinh Mr & Ms Pac-Man

    Tham gia ngày:
    13/10/08
    Bài viết:
    265
    Nơi ở:
    Hà Nội
    1/ Event
    Unit enter a region
    Condition
    Region equal to ...
    Unit have item ...
    Action
    ....
    ...
    ...
    2/ Cái này mình k biết :|
    3/ Metamorphosis skill có sẵn của warcraft 3
    4/ Như câu trên :|

    BTW cái hình ở chữ ký của Yan có phải là Tende Freeze! không nhỉ @@
     
    Chỉnh sửa cuối: 23/4/11
  16. kingghot

    kingghot Mr & Ms Pac-Man

    Tham gia ngày:
    15/4/10
    Bài viết:
    290
    Nơi ở:
    Rach Gia
    Hỏi :

    1/ Làm sao có cái khu cấm ( ví dụ Một cái xe vào thì sẽ văng ra nghĩa là chở về nơi xuất phát cùng với báo lỗi )
    2/ Làm sao cho một món gì ấy rời xuống chõ đó?
    3/ Làm sao thắng khi đủ điểm
     
  17. kindsitinh

    kindsitinh Mr & Ms Pac-Man

    Tham gia ngày:
    13/10/08
    Bài viết:
    265
    Nơi ở:
    Hà Nội
    1/ Bạn tạo 1 region
    Sau đó đặt các pathing blocker xung quanh nó để chặn không cho đi vào...
    Tạo 1 trigger
    Event
    A Unit Enter A Region
    COndition
    Region Equal to ( Region vừa tạo )
    Action
    Cái này thì tùy bạn ... Kill Triggering Unit chẳng hạn :D
    Báo lỗi thì Create floating text that read "( Nội dung )"
     
    Chỉnh sửa cuối: 23/4/11
  18. kingghot

    kingghot Mr & Ms Pac-Man

    Tham gia ngày:
    15/4/10
    Bài viết:
    290
    Nơi ở:
    Rach Gia
    Hỏi :

    1/ Làm một cổng ra vào đa năng ( có thể chọn từng chỗ )
    2/ Cách nào tính toán damge,... cho phù hợp
     
  19. King War

    King War

    Tham gia ngày:
    23/7/10
    Bài viết:
    2,136
    Nơi ở:
    kw_corp@yh
    1
    Mã:
        Events
            Unit - A unit enters [B]Region cấm<gen>[/B]
        Conditions
            (Unit-type of (Entering unit)) Equal to [B]Xe[/B]
        Actions
            Unit - Move (Entering unit) instantly to (Center of [B]Region nơi xuất phát <gen>[/B])
            Game - Display to (Player group((Owner of (Entering unit)))) for 5.00 seconds the text: [B] miss !!![/B]    
    
    2
    Mã:
    Item - Create [B]Tome of Experience[/B] at (Center of [B]Region rời xuống chõ đó <gen>[/B])
    
    3
    if <diem> = <số điểm yêu cầu win>
    -> win
     
  20. goldviper

    goldviper Mario & Luigi Lão Làng GVN

    Tham gia ngày:
    7/1/10
    Bài viết:
    745
    Nơi ở:
    Tổ dân phố
    ^
    ^
    1/ ra vào đa năng kiểu cảm ứng ak' ,nếu vậy thì đặt 1 region trước cái cổng , unit enter region vừa đặt thì action open cái cổng rồi wait 5s close lại chẳng hạn.
    2/ tình toán damage là sao , tính sao cho nó cân bằng game là được , ko có cái gì mạnh quá hay yếu quá.

    mình hỏi 2 câu.
    - 1 unit có 1 spell ko mui , cast spell xong reset lại cooldown và cast tiếp có lỗi ko và tại sao.
    - có thể reset coldown 1 spell thay vì toàn bộ spell của 1 unit ko ?
     
Trạng thái chủ đề:
Không mở trả lời sau này.

Chia sẻ trang này