XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
Десинхронизация
Добрый день всем.
Столкнулся с трудностью в своей карте.
Игрока фаталит при клике на юнита. Единственный триггер который у меня за это отвечает вот:
» ClickOnUnit
void Click() {
    int i = 0
    unit u = GetTriggerUnit()
    rect r = Return_Rect(GetUnitX(u),GetUnitY(u)) //поиск ректа на карте
    whilenot (r==SqRect[i] or i>400) { i++ } //поиск номера ректа
    if IsUnitInGroup(Square_Unit[i],Square_Group) then //при клике, проверка условий нестандартной проходимости
        Doing(SqRect[i],UNIT) //отправлени данных в функцию с распределением на структуры
        UnitRemoveAbility(UNIT,CancelId) //удаление скила пустышки
    endif
    u=null }

bool CheckClick() {
return Count>0 and GetTriggerPlayer()==PLAYER and BoolMove==false }
//Count - кол-во юнитов в группе, дальше проверка на игрока ходящего в данный момент, затем проверка булевой на возможность атаки

private void Init() {
    trigger t = CreateTrigger()
    TriggerRegisterPlayerUnitEvent(t,Player(0),EVENT_PLAYER_UNIT_SELECTED,null)
    TriggerRegisterPlayerUnitEvent(t,Player(1),EVENT_PLAYER_UNIT_SELECTED,null)
    TriggerAddAction(t,function Click)
    TriggerAddCondition(t,Condition(function CheckClick))
    t=null }
Долго гляжу на код но найти причину десинхрона не могу.
Если у вас есть идеи, по сабжу пишите плз =)
Добавлю при игре в одиночной и мультиплеере с ботом критические ошибки не вылетают. Только когда присутствует игрок
Карту выложил, триггер показанный выше расположен как и 60% остальной механики игры в нестандартном коде

Отредактировано AlexKARASb, 15.08.2010 в 09:44.
Старый 14.08.2010, 21:55
Zombain

offline
Опыт: 0
Активность:
Может я не про то, но разве булевом можно проверять возможность атаки?
Старый 14.08.2010, 22:02
Enein
Silenced by ZlaYa1000
offline
Опыт: 43,453
Активность:
Игрока фаталит
причину десинхрона
критическая ошибка != десинхронизация
Старый 14.08.2010, 22:04
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
Zombain, речь идет о пошаговой карте, там все приказы от игрока отключены
все происходит через хит трекаблей или клик юнита, фаталит на клике, вот и ищу прчину
Булевая проверяет включен ли боевой режим
Enein, я подумал что десинхрон, тк выбило только того кто ткнул, а соперник в игре остался
+ добавлю к сабжу, что фаталит только в мультиплеере. И по-моему только у игрока красного, если память не изменяет.
Старый 14.08.2010, 22:05
Enein
Silenced by ZlaYa1000
offline
Опыт: 43,453
Активность:
если карта фаталит и причина где-то в коде - она фаталит у ВСЕХ без исключения..
Enein добавил:
так что думай
Старый 14.08.2010, 22:13
Doc

offline
Опыт: 63,163
Активность:
Enein, нееет, мы сегодня тестили, у меня не сфаталило, просто выкинуло, изза того что нет хоста, т.е. разъединило.
Старый 14.08.2010, 22:15
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
Проблему вроде нашел, однако понять что в ней не то мозга не хватает
Ошибка происходит при отправке данных в эту структуру
» struct
struct Spell
static Spell array s
static int c = 0
unit u
rect r
int id

static void OnOrder(unit u) {
    int i = 0
    whilenot (.s[i].u==u) { i++ }
    if .s[i].id == ChargeId then
        Charge.OnCast(.s[i].r,u,1)
    elseif .s[i].id == Charge2Id then
        Charge.OnCast(.s[i].r,u,2)
    elseif .s[i].id == Charge3Id then
        Charge.OnCast(.s[i].r,u,3)
    elseif .s[i].id == Charge4Id then
        Charge.OnCast(.s[i].r,u,4)
    elseif .s[i].id == Charge5Id then
        Charge.OnCast(.s[i].r,u,5)
    elseif .s[i].id == Charge7Id then
        Charge.OnCast(.s[i].r,u,7)
    elseif .s[i].id == Charge10Id then
        Charge.OnCast(.s[i].r,u,10)
    elseif .s[i].id == Charge20Id then
        Charge.OnCast(.s[i].r,u,20)
    endif
    .s[i].u=null
    .s[i].r=null
    .s[i].destroy()
    .c=.c-1
    .s[i]=.s[.c]
    i-- }
    
static void OnSpell(unit u,rect r,int id) {
    int t = 100
    Main M = INT
    Spell S = Spell.create()
    S.r = r
    S.u = u
    S.id = id
    if id==ChargeId or id==Charge2Id or id==Charge3Id or id==Charge4Id or id==Charge5Id or id==Charge7Id or id==Charge10Id or id==Charge20Id then
        if (id==ChargeId) then
            t=20
        elseif (id==Charge2Id) then
            t=30
        elseif (id==Charge3Id) then
            t=40
        elseif (id==Charge4Id) then
            t=50
        elseif (id==Charge5Id) then
            t=60
        elseif (id==Charge7Id) then
            t=70
        elseif (id == Charge10Id) then
            t=80
        elseif (id == Charge20Id) then
            t=90
        endif
        Main.End_Turn()
    else
        if (M.cmp>0) then
            Range_Create(r,M.cmp,0,0,150)
        else
            Add_Facing_Skills(u)
        endif
    endif
    M.sp = 100 - t
    .s[.c]=S
    .c++ }  
endstruct
Но главное что не понятно для меня ведь в одиночке и игре с ботом с ней ничего не происходит -.-
Старый 14.08.2010, 23:44
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
ладно буду переписывать тогда с нуля =\
можно закрыть тему
Старый 15.08.2010, 09:44
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 00:24.