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

Status
Không mở trả lời sau này.
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
 
Ai cho em hỏi một map Thủ liên tục thì cần yếu tố gì để tạo map

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...
 
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
 
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 .
 
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 ;));));));))
 
^
@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
 
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 đó.
 
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 :)?
 
YAN[asian];18325409 nói:
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 :)?

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 :-/
 
Mã:
Player - For Player 2 (Blue), turn Full shared units On toward Player 1 (Red)
nó đây :-bd.
 
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
 
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 )
 
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 )
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:
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
 
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
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:
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
 
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
 
^
^
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 ?
 
Status
Không mở trả lời sau này.
Back
Top