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

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

Закрытая тема
 
PiCkUpEr_AsT

offline
Опыт: 1,060
Активность:
Помогите с Мультибордом. Я уже не знаю что и думать...
Скрипт:
globals
    integer array udg_row
    hashtable udg_h
endglobals

function find_udg_row takes nothing returns nothing
    local integer i=3
    local integer i2=0
    loop
        exitwhen i==3+CountPlayersInForceBJ(udg_Group[1])
        if GetPlayerSlotState(Player(i2)) == PLAYER_SLOT_STATE_PLAYING then
        set udg_rows[i2+1]=i
        call SaveInteger(udg_h,0,i2+1,i)
        set i = i + 1
        set i2 = i2 + 1
        endif
    endloop
    set i = 4 + CountPlayersInForceBJ(udg_Group[1])
    set i2=5
    loop
        exitwhen i==4 + udg_Total_Num_Players
        if GetPlayerSlotState(Player(i2)) == PLAYER_SLOT_STATE_PLAYING then
        set udg_rows[i2+1]=i
        call SaveInteger(udg_h,0,i2+1,i)
        set i = i + 1
        set i2 = i2 + 1
        endif
    endloop
endfunction

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

function InitTrig_Initialization takes nothing returns nothing
local trigger t = CreateTrigger()
call TriggerRegisterTimerEventSingle(t, 0.1 )
call TriggerAddAction(t, function initialization)
set t=null
endfunction




function add_creep_frag_Conditions takes nothing returns boolean
return GetUnitTypeId(GetTriggerUnit()) == udg_waveunitid[udg_wavecount]
endfunction

function add_creep_frag_Actions takes nothing returns nothing
local integer killingid=GetPlayerId(GetOwningPlayer(GetKillingUnit()))
set udg_creepscore[killingid]=udg_creepscore[killingid]+1 
call MbSetItemValue(udg_mb[11], 2,udg_rows[killingid],"|cFF2EB0FF"+I2S(udg_creepscore[killingid])+"|r")
call MbSetItemValue(udg_mb[12], 2,udg_rows[killingid],"|cFF2EB0FF"+I2S(udg_creepscore[killingid])+"|r")
//при убийстве указанного крипа, в столбике 2 ничего не меняестя. Хотя код рабочий, при старте игры этим кодом все в доске создается правильно(текст)
//Если изменить код на:
//call MultiboardSetItemValueBJ(udg_mb[11],2,udg_rows[killingid],"|cFF2EB0FF"+I2S(udg_creepscore[​killingid])+"|r")
//call MultiboardSetItemValueBJ(udg_mb[12],2,udg_rows[killingid],"|cFF2EB0FF"+I2S(udg_creepscore[​killingid])+"|r")
//то текст меняется ВО ВСЕХ СТРОКАХ ДАННОГО СТОЛБЦА ( в данном случае во 2-ом столбе)
endfunction
//если udg_rows[killingid] заменить (как альтернатива) интегером из Хэша, то опять же текст в заданном месте не меняется
//еще пробовал так:
//local integer i=udg_rows[killingid]
//call MbSetItemValue(udg_mb[12], 2,i,"|cFF2EB0FF"+I2S(udg_creepscore[killingid])+"|r")
//результат:ничего не меняется, но
//если написать так:
//call MultiboardSetItemValueBJ(udg_mb[11],2,i,"|cFF2EB0FF"+I2S(udg_creepscore[killingid])+"​|r")
//ТО НИЧЕГО НЕ ИЗМЕНИТСЯ, если вы внимательно читали, то я писалЮ, если написать:
//call MultiboardSetItemValueBJ(udg_mb[11],2,udg_rows[killingid],"|cFF2EB0FF"+I2S(udg_creepscore[​killingid])+"|r")
//то меняется текст во всех строках, данного столбца на "|cFF2EB0FF"+I2S(udg_creepscore[killingid])+"|r
//Нужен ответ на вопрос: почему так происходит о_О
//И, "починить" данный код, чтобы номер строки для каждого игрока, записался куда нибудь(Хэш или глобалка), в начале игры
//Заранее благодарю
//Проверял правильность подсчета строки командой call DisplayTimedTextToForce( GetForceOfPlayer(Player(0)), 20.00, I2S(udg_rows[killingid]) )
//Пишет 3, как и должно, если я игрок 1


//===========================================================================
function InitTrig_add_creep_frag takes nothing returns nothing
    local trigger t=CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_DEATH )
    call TriggerAddCondition(t, Condition( function add_creep_frag_Conditions ) )
    call TriggerAddAction(t, function add_creep_frag_Actions )
    set t=null
endfunction

Отредактировано ShadoW DaemoN, 16.01.2010 в 15:31.
Старый 15.01.2010, 06:54
Скайнет
Kicked by ZlaYa1000
offline
Опыт: 8,234
Активность:
то текст меняется ВО ВСЕМ СТОЛБИКЕ
если он меняется во всём столбике, то в указателе строк = переменная для (rows) = 0, просмотри правильность подсчёта твоей переменной.
Старый 15.01.2010, 07:02
PiCkUpEr_AsT

offline
Опыт: 1,060
Активность:
Проверял правильность подсчета строки командой call DisplayTimedTextToForce( GetForceOfPlayer(Player(0)), 20.00, I2S(udg_rows[killingid]) )
Пишет 3, как и должно, если я игрок 1
PiCkUpEr_AsT добавил:
vsparker:
то текст меняется ВО ВСЕМ СТОЛБИКЕ
если он меняется во всём столбике, то в указателе строк = переменная для (rows) = 0, просмотри правильность подсчёта твоей переменной.
Ой, сорри, правда udg_rows = 0
значит код
function find_udg_row takes nothing returns nothing
local integer i=3
local integer i2=0
loop
exitwhen i==3+CountPlayersInForceBJ(udg_Group[1])
if GetPlayerSlotState(Player(i2)) == PLAYER_SLOT_STATE_PLAYING then
set udg_rows[i2+1]=i
call SaveInteger(udg_h,0,i2+1,i)
set i = i + 1
set i2 = i2 + 1
endif
endloop
set i = 4 + CountPlayersInForceBJ(udg_Group[1])
set i2=5
loop
exitwhen i==4 + udg_Total_Num_Players
if GetPlayerSlotState(Player(i2)) == PLAYER_SLOT_STATE_PLAYING then
set udg_rows[i2+1]=i
call SaveInteger(udg_h,0,i2+1,i)
set i = i + 1
set i2 = i2 + 1
endif
endloop
endfunction
не работает, где в нем ошибка? почему он не присваивает значения?

Отредактировано ShadoW DaemoN, 16.01.2010 в 15:31.
Старый 15.01.2010, 07:19
avatarDr
Neophyte
offline
Опыт: 6,474
Активность:
Сколько игроков максимум?
Старый 15.01.2010, 10:25
PiCkUpEr_AsT

offline
Опыт: 1,060
Активность:
12, из них 2 компьютера(игрок 11,12)
Старый 16.01.2010, 06:06
PiCkUpEr_AsT

offline
Опыт: 1,060
Активность:
застрял на этой проблеме, нид хелп побыстрее плз)
Старый 16.01.2010, 18:52
DioD

offline
Опыт: 45,134
Активность:
хештаблицу надо не просто объявить а еще и создать функцией InitHashtable()
Старый 17.01.2010, 11:38
PiCkUpEr_AsT

offline
Опыт: 1,060
Активность:
Цитата:
Сообщение от DioD
хештаблицу надо не просто объявить а еще и создать функцией InitHashtable()


Да я знаю) просто забыл здесь написать, а так она у меня инициализирована... тут речь идет о глобалках... а хэш я на всякий случай написал... как еще один вариант... альтернатива глобалке

Проблема в том, что не присваивается значение глобальной udg_rows[1,2,3,...,9,10]
Вроде бы код правильный, но он не выполняется. Как это исправить

П.С. даже если бы я не инициализировал хэш-таблицу, это теоретически все равно не помешало бы присвоить значения глобалке udg_rows[1,2,3,...,9,10]. В 1 скрипте я показал, что использовал 2 способа вытащить информацию, Хэш и глобалка.
Старый 17.01.2010, 11:53
DioD

offline
Опыт: 45,134
Активность:
смысл выкладывать один код если вы используете совсем другой?
не вижу ни одного BJDebug() сообщения, или вы тестируете телепатически?
Старый 17.01.2010, 12:12
PiCkUpEr_AsT

offline
Опыт: 1,060
Активность:
у меня складывается впечатление, что помощь мне не окажут(

специально для Диод
Код:
globals
    integer array udg_row
endglobals

function find_udg_row takes nothing returns nothing
local integer i=3
local integer i2=0
loop
exitwhen i==3+CountPlayersInForceBJ(udg_Group[1])
if GetPlayerSlotState(Player(i2)) == PLAYER_SLOT_STATE_PLAYING then
set udg_rows[i2+1]=i
set i = i + 1
set i2 = i2 + 1
endif
endloop
set i = 4 + CountPlayersInForceBJ(udg_Group[1])
set i2=5
loop
exitwhen i==4 + udg_Total_Num_Players
if GetPlayerSlotState(Player(i2)) == PLAYER_SLOT_STATE_PLAYING then
set udg_rows[i2+1]=i
set i = i + 1
set i2 = i2 + 1
endif
endloop
endfunction

Этот код не выполняется... Почему?
Старый 17.01.2010, 12:15
DioD

offline
Опыт: 45,134
Активность:
ну после каждой итерации выводишь текстовую подсказку и смотришь где происходит сбой.
или ктото другой это должен сделать за тебя?
Старый 17.01.2010, 12:20
PiCkUpEr_AsT

offline
Опыт: 1,060
Активность:
Все нашел ошибку....

function add_creep_frag_Actions takes nothing returns nothing
local integer killingid=GetPlayerId(GetOwningPlayer(GetKillingUnit()))
вот тут надо было написать
local integer killingid=GetPlayerId(GetOwningPlayer(GetKillingUnit()))+1

Спасибо Диод
Старый 17.01.2010, 12:32
Закрытая тема

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

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

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

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



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