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

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

Закрытая тема
 
Ninbous
Jass progress >>>>>35/100
offline
Опыт: 5,674
Активность:
Hellfim Если писать в другом тригере, то возникает ошибка "Undeclared function ShareGold", пробовал ставить выше ниже оба тригера, такая же ошибка.

Ninbous добавил:
Мб нельзя запускать функцию если она находится в другом тригере?
Старый 18.06.2009, 01:11
ScorpioT1000
Работаем
offline
Опыт: отключен
он триггер добавляет выше, создай новый ГУИ тригг, вставь туда код(старый весь потри), выбери "продолжение инициализации карты"
Старый 18.06.2009, 01:18
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
Снеси все кроме InitTrigGold (оставь в старом триггере) в кастом скрипт
Старый 18.06.2009, 01:20
Ninbous
Jass progress >>>>>35/100
offline
Опыт: 5,674
Активность:
>_< я непонял, Что снести, куда вставить, зачем кастом скрипт?, я пишу на жассе.

Ninbous добавил:
и еще AddGold Работает, а ShareGold нет, даже коглда вызывается из AddGold

Ninbous добавил:
Код:
if GetPlayerSlotState(Player(i))!= PLAYER_SLOT_STATE_PLAYING then

Я немного поправил код твой, такое условие будет правильней, так как игроков может вообще не быть сначала, а золото передовать нада.
Старый 18.06.2009, 01:30
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
вобщем убери условия с 5 голдами, задача состоит как я и думал "после лива игрока, раздавать все получаемое им золото поровну остальным активным игрокам"
убрать условие неполучится (если ты про мой пример), разве что заменить его на 0, но толку чуть...
Ninbous, вообщем забей на все, если мой код запустить смог то все гуд, иначе говнокодинг
Старый 18.06.2009, 01:32
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
Ок, на =)

Hellfim добавил:
Не надо там ничего поправлять, там все правильно...
Прикрепленные файлы
Тип файла: w3m Gold System.w3m (16.5 Кбайт, 14 просмотров )
Старый 18.06.2009, 01:37
J
expert
offline
Опыт: 48,447
Активность:
Hellfim не обижайся мне твой вариант ненравится
чтобы вновь не жаловались что я говорою сделать хорошо но не обьесняю как, мои руки чисты) я спать
Старый 18.06.2009, 01:38
Ninbous
Jass progress >>>>>35/100
offline
Опыт: 5,674
Активность:
J Ошибка в расчетах какая то, у тя нулевого игрока отнимается по 10 золото а остальным дается по 50, даже если игроков нет.
Hellfim Нужно исправить ) У меня игроки 0(красный) и 6(Зеленый) неиспользуются для передачи голда.
Неработает передача. Голд каждую секунду идет всем игрокам но он не передается мне.
Старый 18.06.2009, 01:45
Ninbous
Jass progress >>>>>35/100
offline
Опыт: 5,674
Активность:
Код:
globals           
    boolean array staplay
endglobals

function Trig_Gold_Actions takes nothing returns nothing
    local integer i = 1
    local integer gold
    local integer i2 = 1
    loop
       exitwhen i>5 
       if  GetPlayerSlotState(Player(i)) != PLAYER_SLOT_STATE_PLAYING then
           set staplay[GetPlayerId(Player(i))] = true //Устанавливаются игроки которые вышли из игры
       endif  
       set i = i+1
    endloop
    set i = 1
    loop
        set gold = GetPlayerState(Player(i), PLAYER_STATE_RESOURCE_GOLD)
        if (staplay[i])then
            loop //Цикл чтобы равномерно передать все его золото союзникам
               if gold >=5 then //Если у ливера больше 5 золота то вем игрокам(включая его) достается по 1 золоту
                   set gold = gold - 5
                   loop
                      call SetPlayerState(Player(i2), PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(Player(i2), PLAYER_STATE_RESOURCE_GOLD) + 1) 
                   exitwhen i2 == 5
                   set i2 = i2+1
                   endloop
               endif
             exitwhen gold < 5//Вот у ливера стало меньше 5 золота, и он больше неможет передать его игрокам своей тимы
             endloop
             call SetPlayerState(Player(i), PLAYER_STATE_RESOURCE_GOLD, gold+1) //Ему добавляется +1 золота каждую секунду.
        else
             call SetPlayerState(Player(i), PLAYER_STATE_RESOURCE_GOLD, gold+1)//Если игрк не ливер то ему дается как положено +1 золота в сек.
        endif                   
    exitwhen i == 5
    set i = i + 1
    endloop
endfunction

//===========================================

function InitTrig_Gold2 takes nothing returns nothing
    set gg_trg_Gold2 = CreateTrigger(  )
    call TriggerRegisterTimerEventPeriodic( gg_trg_Gold2, 1.00 )
    call TriggerAddAction( gg_trg_Gold2, function Trig_Gold_Actions )
endfunction

Попытался исправить код J, золото отнимается у ливеров мгновенно, но не добавляется мне, непойм почему там ведь стоит цикл который должен довать +1 голд каждому игроку(5 всего) за каждые 5 голда ливера.
Помогите плиз

Отредактировано Ninbous, 19.06.2009 в 00:17.
Старый 19.06.2009, 00:11
Garret
Недоброе творится
offline
Опыт: 3,893
Активность:
Ninbous
1. Зачем обновлять каждую секунду, кто вышел из игры? Это достаточно делать один раз при одноимённом событии
2. Нумерация игроков идёт с нуля, а у тебя i2 = 1 и i = 1
3. Не происходит инициализация staplay[]
Старый 19.06.2009, 00:39
Ninbous
Jass progress >>>>>35/100
offline
Опыт: 5,674
Активность:
Garret
1. Игроков может не быть с начала игры. Если использовать событие игрок вышел из игры, то к дополнению придется еще проверять при инициализации сколько игроков играет.
2.Игрок 0 у меня неиспользуется
3.Что это значит? "set staplay[GetPlayerId(Player(i))] = true" вот же или ты о другом?
Старый 19.06.2009, 01:03
Garret
Недоброе творится
offline
Опыт: 3,893
Активность:
  1. Да, разумеется, надо в начале игры тоже проверять
  2. Я этого не знал
  3. От неинициализированных интегеров поток умирает. Как с буленами - не в курсе, но возможны проблемы от этого.
Старый 19.06.2009, 01:08
Ninbous
Jass progress >>>>>35/100
offline
Опыт: 5,674
Активность:
Garret А как его инициализировать?
Старый 19.06.2009, 01:12
Garret
Недоброе творится
offline
Опыт: 3,893
Активность:
Задать начальные значения, к примеру, false.
Старый 19.06.2009, 01:27
Ninbous
Jass progress >>>>>35/100
offline
Опыт: 5,674
Активность:
Garret Звучит странно но попробую.
Вот так?
Код:
local integer i = 1
loop
set staplay[i] = false
set i = i+1
exitwhen i == 5
endloop


Непомогло
Старый 19.06.2009, 01:50
Garret
Недоброе творится
offline
Опыт: 3,893
Активность:
Не веришь? Вот пример:
Код:
local boolean b
call BJDebugMsg("1")
if b then
endif
call BJDebugMsg("2")

Выведет 1
Код:
local boolean b = false\true
call BJDebugMsg("1")
if b then
endif
call BJDebugMsg("2")

Выведет 1,2
Значит надо исать где-то ещё.
Старый 19.06.2009, 11:25
Ninbous
Jass progress >>>>>35/100
offline
Опыт: 5,674
Активность:
Garret Да проверил, но проблема в чем то другом так как я уже поставил код инициализации (пост 35)
Одну ошибку нашел: Надо было ставить set i2 = 1 после цикла...

Ninbous добавил:
Все я сам разобрался вот код
Код:
function Trig_Gold_Actions takes nothing returns nothing
    local integer i = 1
    local integer gold = 0
    local integer i2 = 1
    set i = 1
    loop
       exitwhen i>5 
       if  GetPlayerSlotState(Player(i)) != PLAYER_SLOT_STATE_PLAYING then
           set staplay[GetPlayerId(Player(i))] = true 
       endif  
       set i = i+1
    endloop
    set i = 1
    loop
        set gold = GetPlayerState(Player(i), PLAYER_STATE_RESOURCE_GOLD)
        if (staplay[i])then
            loop
               if gold >=4 then
                   set gold = gold - 4
                   loop
                      if i2 != i then //надо было исключить самого игрока ливера, получалось что мы сами себе передаем голд. Это 1 ошибка.
                        call SetPlayerState(Player(i2), PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(Player(i2), PLAYER_STATE_RESOURCE_GOLD) + 1) 
                      endif
                   exitwhen i2 == 5
                   set i2 = i2+1
                   endloop
                   set i2 = 1// Терь цикл идет правильно, ето 2 ошибка
               endif
             exitwhen gold < 4
             endloop
             call SetPlayerState(Player(i), PLAYER_STATE_RESOURCE_GOLD, gold+1)
        else
             call SetPlayerState(Player(i), PLAYER_STATE_RESOURCE_GOLD, gold+1)
        endif                   
    exitwhen i == 5
    set i = i + 1
    endloop
endfunction


Гы, так все просто )) Закрывайте тему, всем спасибо!

Отредактировано Ninbous, 19.06.2009 в 18:46.
Старый 19.06.2009, 19:00
Закрытая тема

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

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

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

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



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