Сейчас 17:32:07 Понедельник, 6 мая, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » Вопросы по картостроению » Новый лидер группы и движение (Снова я...)
Новый лидер группы и движение
DreiiДата: Воскресенье, 03 Апреля 2011, 19:33:17 | Сообщение # 1
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:

Суть такова.Когда умирает Лидер отряда в триггере GLeaderDies устанавливаеться новый случайный лидер. Но когда отдаешь приказ о движении с новым лидером,то вар вылетает\\Что делать?


 

[DUОS]Дата: Понедельник, 04 Апреля 2011, 08:40:57 | Сообщение # 2
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
Dreii,
А, ну конечно!
Code
function Trig_GMove_Actions takes nothing returns nothing
       local integer oid = GetIssuedOrderId()
       local unit t = GetTriggerUnit()
       local integer id = GetHandleId(t)
       local group g = LoadGroupHandle(hash,id,2)
       local unit ou = GetOrderedUnit()    
       local unit l=LoadUnitHandle(hash,id,1)

       if IsUnitType(ou,UNIT_TYPE_STRUCTURE) == false and ou == l then
           if GetTriggerEventId() == EVENT_PLAYER_UNIT_ISSUED_ORDER then
               call GroupImmediateOrderById(g,oid)
           elseif GetTriggerEventId() == EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER then
               call GroupPointOrderById(g,oid,GetOrderPointX(),GetOrderPointY())      
           elseif GetTriggerEventId() == EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER then
               call GroupTargetOrderById(g,oid,GetOrderTarget())        
           endif
       endif
       set t = null
       set g = null
       set ou = null
endfunction
//===========================================================================
function InitTrig_GMove takes nothing returns nothing
       set gg_trg_GMove = CreateTrigger(  )
       call TriggerRegisterAnyUnitEventBJ( gg_trg_GMove, EVENT_PLAYER_UNIT_ISSUED_ORDER )
       call TriggerRegisterAnyUnitEventBJ( gg_trg_GMove, EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER )
       call TriggerRegisterAnyUnitEventBJ( gg_trg_GMove, EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER )
       call TriggerAddAction( gg_trg_GMove, function Trig_GMove_Actions )
endfunction

В IssueImmediateOrderById ты им приказываешь хендл. Ох лол...
Проверяй.
З.Ы.: поправил это.


НУ И ЧТО ТЕПЕРЬ?


Кликайте на дракошку ;)
 

GraF251996Дата: Понедельник, 04 Апреля 2011, 11:46:43 | Сообщение # 3
8 уровень
Группа: Проверенные
Сообщений: 756
Награды: 1
Репутация: 321
Блокировки:
Есть отлично работающий исходник системы отрядов,если нужно,могу кинуть.

12Gb RAM 1333@1600 | AMD Phenom II x4 B50 3.1Ghz@3.70Ghz | Asus Xonar D1 | Asus GTX560Ti 1Gb GDDR5 820Mhz@965Mhz | Asus VW225N
 

DreiiДата: Вторник, 05 Апреля 2011, 15:35:23 | Сообщение # 4
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
[DUОS], *Хлопает глазами* что?

Добавлено (05-04-2011, 15:35)
---------------------------------------------

Quote
IssueImmediateOrderById

в упор невидно оО


 

[DUОS]Дата: Вторник, 05 Апреля 2011, 15:37:49 | Сообщение # 5
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
Dreii,
call GroupImmediateOrderById(g,id) у тебя было. Ты получается приказал хендл ahaha


НУ И ЧТО ТЕПЕРЬ?


Кликайте на дракошку ;)
 

DreiiДата: Вторник, 05 Апреля 2011, 15:40:06 | Сообщение # 6
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
[DUОS], мм ну а как тогда быть?

 

[DUОS]Дата: Вторник, 05 Апреля 2011, 15:40:26 | Сообщение # 7
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
Dreii,
call GroupImmediateOrderById(g,oid) - тогда всё окей будет.


НУ И ЧТО ТЕПЕРЬ?


Кликайте на дракошку ;)
 

DreiiДата: Вторник, 05 Апреля 2011, 19:12:36 | Сообщение # 8
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
[DUОS], ах это,это да)) я понял что там ошибся,но поставви нужный приказ всеравно критует)

Добавлено (05-04-2011, 19:12)
---------------------------------------------
Опять ждем гениев джасса


 

swdnДата: Среда, 06 Апреля 2011, 08:41:25 | Сообщение # 9
1 уровень
Группа: Пользователи
Сообщений: 13
Награды: 0
Репутация: 32
Блокировки:
На соседний сайт не заходишь, ладно, здесь напишу.

1. При отдаче приказа (в триггере GMove) происходит зацикливание (юниту отдается приказ -> активируется событие отдачи приказа -> юниту отдается приказ -> активируется событие и т. д.)

2. При тренировке юнита-лидера (в триггере GTrain) он не добавляется в группу. Однако он зачем-то удаляется из группы (в триггере GLeaderDies), причем зачем-то ДВА раза. Тем не менее, вновь выбранный лидер не удаляется из группы, из-за чего происходит пункт 1.

3. Непонятно, что за способности с равкодами 'A000' и 'A001'. Можно предположить, что первая дается лидеру, а вторая - подчиненным в группе. Тогда почему не удаляется вторая способность с вновь выбранного лидера? И почему бы не сделать проверку на наличие способностей, вместо того, чтобы записывать/читать из хеша юнита?

 

DreiiДата: Среда, 06 Апреля 2011, 15:47:57 | Сообщение # 10
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
Quote
. При отдаче приказа (в триггере GMove) происходит зацикливание (юниту отдается приказ -> активируется событие отдачи приказа -> юниту отдается приказ -> активируется событие и т. д.)

Как испарвить?

Добавлено (06-04-2011, 15:47)
---------------------------------------------
swdn, там же приказ отдаеться только членам группы


 

swdnДата: Среда, 06 Апреля 2011, 20:33:24 | Сообщение # 11
1 уровень
Группа: Пользователи
Сообщений: 13
Награды: 0
Репутация: 32
Блокировки:
Dreii, пункт 1 - проблема, пункт 2 - причина, пункт 3 - как исправить.

Если нужно с минимумом изменений, то попробуй так:

Code

function Trig_GLeaderdies_Actions takes nothing returns nothing
     local unit t = GetTriggerUnit()
     local integer id = GetHandleId(t)
     //local integer i  // это не нужно, так как не используется
     local group g = LoadGroupHandle(hash, id, 2)
     local unit u = null
     //call GroupRemoveUnit(g,t)  // это не нужно
     if t == LoadUnitHandle(hash, id, 1) then
         //call GroupRemoveUnit(g,LoadUnitHandle(hash,id,1))  // это не нужно                 
         set u  = GroupPickRandomUnit(g)
         set id = GetHandleId(u)
         call GroupRemoveUnit(g, u)  // удаляем нового лидера из группы
         call SaveUnitHandle (hash, id, 1, u)
         call SaveGroupHandle(hash, id, 2, g)
         call UnitAddAbility (u, 'A000')
         call SelectUnitAddForPlayer(u, GetOwningPlayer(u))
     endif
     set u = null
     set g = null
     set t = null
endfunction

//===========================================================================
function InitTrig_GLeaderdies takes nothing returns nothing
     set gg_trg_GLeaderdies = CreateTrigger(  )
     call TriggerRegisterAnyUnitEventBJ( gg_trg_GLeaderdies, EVENT_PLAYER_UNIT_DEATH )
     call TriggerAddAction( gg_trg_GLeaderdies, function Trig_GLeaderdies_Actions )
endfunction

Насчет работоспособности не уверен, поэтому если не получится, сделай тестовую карту и вынеси туда всю систему отрядов. На ощупь разбираться проблематично.

Да, и лучше будет переписать код с учётом пункта 3.

 

Форум о Warcraft 3 » Раздел для картостроителей » Вопросы по картостроению » Новый лидер группы и движение (Снова я...)
  • Страница 1 из 1
  • 1
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz