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

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

Закрытая тема
 
Ninbous
Jass progress >>>>>35/100
offline
Опыт: 5,674
Активность:
Раздача золота от игрока который вышел из игры.
Никак немогу сообразить, как написать функцию которая бы передовала каждую секунду золото от игрока который ливнул, другим игрокам в его клане.
Вот как я делал для каждого игрока:
Код:
set i = 1
    if GetPlayerSlotState(Player(1)) != PLAYER_SLOT_STATE_PLAYING then
    loop
    exitwhen  GetPlayerState(Player(1), PLAYER_STATE_RESOURCE_GOLD) < 5
        call SetPlayerState(Player(1), PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(Player(1), PLAYER_STATE_RESOURCE_GOLD) - 5)
        loop
        exitwhen i > 5
            call SetPlayerState(Player(i), PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(Player(i), PLAYER_STATE_RESOURCE_GOLD) + 1)
            set i = i + 1
        endloop  
    endloop
    endif


поидее должно у Player(1) отниматся в цикле по 5 голда и передоватся по 1 голду другим 5 игрокам до тех пор пока у него не станет менее 5 голда... где я допустил ошибку? Или можете свой код скинуть
Старый 17.06.2009, 23:12
Hellfim
Новичок
offline
Опыт: 79,880
Активность:
Код:
//...
    if GetPlayerSlotState(Player(1)) != PLAYER_SLOT_STATE_PLAYING then
        loop
            exitwhen  GetPlayerState(Player(1), PLAYER_STATE_RESOURCE_GOLD) < 5
            call SetPlayerState(Player(1), PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(Player(1), PLAYER_STATE_RESOURCE_GOLD) - 5)
            loop
                exitwhen i > 5
                call SetPlayerState(Player(i), PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(Player(i), PLAYER_STATE_RESOURCE_GOLD) + 1)
                set i = i + 1
            endloop
            set i = 1
        endloop
    endif
//...
Старый 17.06.2009, 23:36
Ninbous
Jass progress >>>>>35/100
offline
Опыт: 5,674
Активность:
Hellfim у меня так же стоит перед каждой такой функцией set i = 1. Я думаю разницы никакой
если ставить перед функцией, ну вот весь код чтобы было легче представить:

Код:
function Trig_Gold_Actions takes nothing returns nothing
local integer i = 1
local integer i2 = 7
loop
  exitwhen i > 11
    call SetPlayerState(Player(i), PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(Player(i), PLAYER_STATE_RESOURCE_GOLD) + 1)
    set i = i + 1
endloop  
    //Sentinel
    set i = 1
    if GetPlayerSlotState(Player(1)) != PLAYER_SLOT_STATE_PLAYING then
    loop
    exitwhen  GetPlayerState(Player(1), PLAYER_STATE_RESOURCE_GOLD) < 5
        call SetPlayerState(Player(1), PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(Player(1), PLAYER_STATE_RESOURCE_GOLD) - 5)
        loop
        exitwhen i > 5
            call SetPlayerState(Player(i), PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(Player(i), PLAYER_STATE_RESOURCE_GOLD) + 1)
            set i = i + 1
        endloop  
    endloop
    endif
    set i = 1
    if GetPlayerSlotState(Player(2)) != PLAYER_SLOT_STATE_PLAYING then
    loop
    exitwhen  GetPlayerState(Player(2), PLAYER_STATE_RESOURCE_GOLD) < 5
        call SetPlayerState(Player(2), PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(Player(2), PLAYER_STATE_RESOURCE_GOLD) - 5)
        loop
        exitwhen i > 5
            call SetPlayerState(Player(i), PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(Player(i), PLAYER_STATE_RESOURCE_GOLD) + 1)
            set i = i + 1
        endloop  
    endloop
    endif
    set i = 1
    if GetPlayerSlotState(Player(3)) != PLAYER_SLOT_STATE_PLAYING then
    loop
    exitwhen  GetPlayerState(Player(3), PLAYER_STATE_RESOURCE_GOLD) < 5
        call SetPlayerState(Player(3), PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(Player(3), PLAYER_STATE_RESOURCE_GOLD) - 5)
        loop
        exitwhen i > 5
            call SetPlayerState(Player(i), PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(Player(i), PLAYER_STATE_RESOURCE_GOLD) + 1)
            set i = i + 1
        endloop  
    endloop
    endif
    set i = 1
    if GetPlayerSlotState(Player(4)) != PLAYER_SLOT_STATE_PLAYING then
    loop
    exitwhen  GetPlayerState(Player(4), PLAYER_STATE_RESOURCE_GOLD) < 5
        call SetPlayerState(Player(4), PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(Player(4), PLAYER_STATE_RESOURCE_GOLD) - 5)
        loop
        exitwhen i > 5
            call SetPlayerState(Player(i), PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(Player(i), PLAYER_STATE_RESOURCE_GOLD) + 1)
            set i = i + 1
        endloop  
    endloop
    endif
    set i = 1
    if GetPlayerSlotState(Player(5)) != PLAYER_SLOT_STATE_PLAYING then
    loop
    exitwhen  GetPlayerState(Player(5), PLAYER_STATE_RESOURCE_GOLD) < 5
        call SetPlayerState(Player(5), PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(Player(5), PLAYER_STATE_RESOURCE_GOLD) - 5)
        loop
        exitwhen i > 5
            call SetPlayerState(Player(i), PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(Player(i), PLAYER_STATE_RESOURCE_GOLD) + 1)
            set i = i + 1
        endloop  
    endloop
    endif
endfunction

//===========================================================================
function InitTrig_Gold takes nothing returns nothing
    set gg_trg_Gold = CreateTrigger(  )
    call TriggerRegisterTimerEventPeriodic( gg_trg_Gold, 1.00 )
    call TriggerAddAction( gg_trg_Gold, function Trig_Gold_Actions )
endfunction
Старый 17.06.2009, 23:45
ScorpioT1000
Работаем
offline
Опыт: отключен
и в чем прикол этого говнокодинга?
Старый 17.06.2009, 23:52
Ninbous
Jass progress >>>>>35/100
offline
Опыт: 5,674
Активность:
ScorpioT1000 1 пост прочитай и поймеш
Старый 17.06.2009, 23:53
Hellfim
Новичок
offline
Опыт: 79,880
Активность:
Ninbous, друк, просто скопируй и все поймешь =)
Старый 17.06.2009, 23:59
Garret
Недоброе творится
offline
Опыт: 3,893
Активность:
Ninbous
Чувак, не тупи... Возьми, посчитай (а можно просто хранить где-нибудь в переменной), скольким игрокам нужно раздавать золото.... Потом просто идёшь по ним и добавляешь золото нужного игрока / кол-во игроков. В конце голд обнуляешь.
Старый 17.06.2009, 23:59
J
expert
offline
Опыт: 48,747
Активность:
я прочел, но непонял
Старый 17.06.2009, 23:59
Hellfim
Новичок
offline
Опыт: 79,880
Активность:
и да, нумерация игроков начинается с 0

Hellfim добавил:
Ну если вкратце, то у него цикл в цикле и, после первого круга первого цикла, перменная для второго цикла не приводится к начальному значению.
Старый 18.06.2009, 00:01
Ninbous
Jass progress >>>>>35/100
offline
Опыт: 5,674
Активность:
Hellfim Аа я понял спасибо друГ, а насчет игроков то мне как раз игрок красный ненужен, поетому я его невзял. Ты мну спас просто )
Тему закрыть.

Ninbous добавил:
Garret Это неоптимально

Ninbous добавил:
J Обьясню понятней, вот идет игра, в клане 5 игроков, один из игроков выходит из игры и теперь нада чтобы все его золото равномерно распределилось между остальными игроками.
Старый 18.06.2009, 00:21
J
expert
offline
Опыт: 48,747
Активность:
я не говорю что я не понял что ты написал, я говорю что я так и не понял почему в первом посте я пойму почему это не говнокодинг...
я писал в блокноте, может не работать, но думать надо в этом направлении
Код:
globals           
    boolean array staplay
    integer sumadd = 0
endglobals

function Trig_Gold_Actions takes nothing returns nothing
    set staplay[GetPlayerId(GetTriggerPlayer())] = true
    set sumadd = sumadd + 1
endfunction

function Trig_Gold_Timer takes nothing returns nothing
    local integer i = 0                         
    local integer gold
    loop
        set gold = GetPlayerState(Player(i), PLAYER_STATE_RESOURCE_GOLD)
        if (staplay[i]) then
            if (gold >= 5) then
                set gold = gold - 5
            else
                set staplay[i] = false
                set sumadd = sumadd - 1
            endif
        else
            set gold = gold + 1 + sumadd
        endif
        call SetPlayerState(Player(i), PLAYER_STATE_RESOURCE_GOLD, gold)
        exitwhen i == 5
        set i = i + 1      
    endloop
endfunction

function InitTrig_Gold takes nothing returns nothing
    local integer i = 0
    local timer Tm = CreateTimer()
    call TimerStart(Tm, 1, true, function Trig_Gold_Timer)
    set gg_trg_Gold = CreateTrigger()
    call TriggerRegisterTimerEventPeriodic(gg_trg_Gold, 1)
    loop
        call TriggerRegisterPlayerEvent(gg_trg_Gold, Player(i), EVENT_PLAYER_LEAVE)
        exitwhen i == 5
        set i = i + 1      
    endloop
    call TriggerAddAction(gg_trg_Gold, function Trig_Gold_Actions) 
endfunction

Отредактировано J, 18.06.2009 в 00:48.
Старый 18.06.2009, 00:24
ScorpioT1000
Работаем
offline
Опыт: отключен
Ninbous, у тебя в коде 5 блоков, которые отличаются лишь одной цифрой, причем динамически изменяемой. Это не тру.
Старый 18.06.2009, 00:33
Ninbous
Jass progress >>>>>35/100
offline
Опыт: 5,674
Активность:
ScorpioT1000 Вероятно ты прав так как Jass начал понимать месяц назадЮ я думаю можно сделать третий Цикл с переменной для индекса игрока.
Старый 18.06.2009, 00:34
ScorpioT1000
Работаем
offline
Опыт: отключен
Цитата:
call TimerStart(Tm, 1, true, function Trig_Gold_Timer)

если честно, у Jon'а не очень тру, т.к. вроде есть эвент изменения золота, надо его и юзать, т.к. он нативный
Старый 18.06.2009, 00:39
J
expert
offline
Опыт: 48,747
Активность:
ну и чем это может пригодится?
Старый 18.06.2009, 00:40
Ninbous
Jass progress >>>>>35/100
offline
Опыт: 5,674
Активность:
Цитата:
тут золото у ливера падает ниже 4 монет?

ну так как у меня отнимается 5 золота у одного игрока чтобы дать его остальным четырем игрокам, оно должно быть по условию всегда выше 4 монет, потомучто если у ливера будет 2 голда, то при отнимании 5 монет в итоге получится 0 (то есть отнялось 2 монеты), а 4 игрока получт по 1 монете в итоге 4 золота пришло, хотя у ливер было только 2 монеты. Поэтому я ставил условие и голд у ливера непадает ниже 4 монет. Хотя ето неважно.



Цитата:
нет, написал вчера, заранее

=)


Цитата:
пытайся его описать словами

уже пробую
Старый 18.06.2009, 00:42
J
expert
offline
Опыт: 48,747
Активность:
ScorpioT1000 если ты хочешь отслеживать им когда золота меньше петяти то это не красиво, всегда когда некрасиво это не тру

J добавил:
Цитата:
ну так как у меня отнимается 5 золота у одного игрока чтобы дать его остальным четырем игрокам, оно должно быть по условию всегда выше 4 монет, потомучто если у ливера будет 2 голда, то при отнимании 5 монет в итоге получится 0 (то есть отнялось 2 монеты), а 4 игрока получт по 1 монете в итоге 4 золота пришло, хотя у ливер было только 2 монеты. Поэтому я ставил условие и голд у ливера непадает ниже 4 монет. Хотя ето неважно.
у меня стоит условие на ниже 5 монет

J добавил:
единственое что я не понял почему в моем алгоритме массив o_O, сейчас уберу
Старый 18.06.2009, 00:47
ScorpioT1000
Работаем
offline
Опыт: отключен
Цитата:
написать функцию которая бы передовала каждую секунду золото от игрока который ливнул, другим игрокам в его клане.

я так и не пойму условие - помойму 5 голда только пример. или нет?
Старый 18.06.2009, 00:51
Hellfim
Новичок
offline
Опыт: 79,880
Активность:
Вот написал тут небольшую системку, протестируй.
» code

Код:
globals
    integer firsts=0
    integer seconds=0
    integer add_counter=0
endglobals

function ShareGold takes player p returns nothing
    local integer i=0
    local integer j=GetPlayerState(p,PLAYER_STATE_RESOURCE_GOLD)
    local integer t=0
    local integer end=GetPlayerId(p)
    if end<=4 then//Первая группа игроков, в данном случае первые 5
        set i=0
        set end=4
        set firsts=firsts-1
        set t=firsts
    else//Вторая группа игроков, в данном случае с 6 по 10
        set i=5
        set end=9
        set seconds=seconds-1
        set t=seconds
    endif
    loop
        exitwhen i>end
        if GetPlayerSlotState(Player(i)) != PLAYER_SLOT_STATE_LEFT then
            call SetPlayerState(Player(i),PLAYER_STATE_RESOURCE_GOLD,GetPlayerState(Player(i)PLAY  ER_STATE_RESOURCE_GOLD)+j/t)
        endif
        set i=i+1
    endloop
endfunction

function AddGold takes nothing returns nothing
    local integer i=0
    loop
        exitwhen i>9
        call SetPlayerState(Player(i),PLAYER_STATE_RESOURCE_GOLD,GetPlayerState(Player(i),PLA  YER_STATE_RESOURCE_GOLD)+1)
        set i=i+1
    endloop
    set add_counter=add_counter-1
    if add_counter==0 then
        set i=0
        set add_counter=30
        loop
            exitwhen i>9
            if GetPlayerSlotState(Player(i))==PLAYER_SLOT_STATE_LEFT then
                call ShareGold(Player(i))
            endif
        endloop
    endif
endfunction

function InitTrig_Gold takes nothing returns nothing
    call TimerStart(CreateTimer(),1.00,true,function AddGold)
endfunction



Hellfim добавил:
Омг, джон первый =\

И в дополнение к моей системке: у тебя же наверняка есть триггер, который отлавливает ливнувшего игрока? Так вот, допиши туда через Custom Script

Код:
call ShareGold(GetTriggerPlayer())
Старый 18.06.2009, 00:54
ScorpioT1000
Работаем
offline
Опыт: отключен
вобщем убери условия с 5 голдами, задача состоит как я и думал "после лива игрока, раздавать все получаемое им золото поровну остальным активным игрокам"
Старый 18.06.2009, 01:02
Закрытая тема

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

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

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

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



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