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

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

Закрытая тема
 
marsh123
Member+
offline
Опыт: 1,219
Активность:
Проверить, за какого героя играет игрок?
Извините, что так много тем создаю, просто только начал учить ДЖАСС и есть некоторые вопросы,

Ну так вот, я пытаюсь определить за какого героя играет игрок, при условии что у каждого игрока только 1 герой, написал такой код:
Код:
if Player(pid) == GetOwningPlayer('Emoo') then

Emoo - код мираны
pid - параметр ф-ции(Integer)

Но выдает ошибку:
Cannot Convert Integer To Unit.

Я так понял моя фукция должна брать игрока с ид параметра ф-ции и сравнивать его с игроком - владельцем мираны, не понимаю тогда где у нее там не конвертитца Инт В Юнит?

Я впринципе догадываюсь в чем проблема, но как тогда определить то, что мне нужно?

Отредактировано marsh123, 30.11.2008 в 11:46.
Старый 30.11.2008, 11:31
adic3x

offline
Опыт: 108,439
Активность:
елементарно, тебе надо передаить не интегер значение типа юнита, а хендл конкретного юнита, к примеру GetOwningPlayer(GetFilterUnit())
Старый 30.11.2008, 11:51
marsh123
Member+
offline
Опыт: 1,219
Активность:
ADOLF
Я правильно понял?
if Player(pid) == GetOwningPlayer(GetFilterUnit('Emoo')) then ?

Тогда:
Too Mane Arguements Passed To Function - ошибка компиля
Старый 30.11.2008, 12:06
adic3x

offline
Опыт: 108,439
Активность:
нет конечно

ADOLF добавил:
ГетФилтерЮнитов вообще не должен ничего принимать

ADOLF добавил:
в каком случае тебе надо рповерять владельца? содержиться ли твоя мирана в переменной (не инт тип юнита, а сам юнит) ?
Старый 30.11.2008, 12:15
exploder
iOS zealot
offline
Опыт: 19,394
Активность:
Ему по видимому нужно проверить id героя, принадлежащего конкретному игроку.
Старый 30.11.2008, 12:26
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Цитата:
я пытаюсь определить за какого героя играет игрок, при условии что у каждого игрока только 1 герой

Тогда можно смело пикать и записывать ид пикнутого юнита в массив:
Код:
globals
  integer array heroes
  group gr = CreateGroup()
endglobals

function Enum takes nothing returns boolean
  if IsUnitType(GetFilterUnit(), UNIT_TYPE_HERO) then
    set heroes[GetPlayerId(GetOwningPlayer(GetFilterUnit()))] = GetUnitTypeId(GetFilterUnit())
  endif
  return false
endfunction

// >>---
call GroupEnumUnitsInRect(gr, bj_mapInitialPlayableArea, Filter(function Enum))
// >>---

Однако лучше будет проверять и записывать ид героя в массив при непосредственном выборе героя.
Старый 30.11.2008, 12:46
marsh123
Member+
offline
Опыт: 1,219
Активность:
ShadoW DaemoN
Чет я не совсем понял твою функцию, хотя может и понял но это не совсем то..

Мне нужно, чтобы в параметрах ф-ции я мог ввести ID игрока, после чего через
if <сравнение> then

elseif <сравнение>

elseif <сравнение>

итп.. Определялся каким героем владеет игрок, ИД которого я ввел..

Цитата:
содержиться ли твоя мирана в переменной (не инт тип юнита, а сам юнит)

Нет, переменных я не создавал, только стандартную привел, значит Emoo нельзя использовать? Что-то я совсем запутался
Старый 30.11.2008, 13:35
J
expert
offline
Опыт: 48,447
Активность:
marsh123 сделать массив юнитов, при создании/выборе героя помещай его в массив под ячейку ноера игрока, потом когда тебе нужен герой какого то игрока достовай его из этого массива под индесом номера этого игрока
Старый 30.11.2008, 13:39
marsh123
Member+
offline
Опыт: 1,219
Активность:
Jon
Тоесть отследить каким героем управляет игрок можно только через преднамеренное занесение в массив руками ? :(
Старый 30.11.2008, 13:54
Dragon Knight
Меткий стрелок!!!
offline
Опыт: 4,138
Активность:
Код:
globals
    group pg = CreateGroup()
    player p = Player(0) //Игрок у которого надо проверить героя определённого типа
endglobals


function MyFunc takes nothing returns nothing
    local integer heroid='Emoo'//Равкод героя, с помощью которого надо определить - играет ли игрок, героем этого типа
    local unit gu
    call GroupEnumUnitsInRect(pg, bj_mapInitialPlayableArea, null)

    loop
          set gu=FirstOfGroup(pg)
          exitwhen gu==null
          if GetOwningPlayer(gu)==p and IsUnitType(gu,UNIT_TYPE_HERO) and GetUnitTypeId(gu)==heroid then// проверка: принадлежит игроку p, герой gu с равкодом heroid
              <какие-то действия>
          endif
          call GroupRemoveUnit(pg,gu)
          set gu=null
    endloop

endfunction


Dragon Knight добавил:
Цитата:
Тоесть отследить каким героем управляет игрок можно только через преднамеренное занесение в массив руками ? :(


зачем руками - создавай героев в определённом регионе, а на событие "A unit Enter Region" заноси Triggering Unit в массив под номером игрока(пример: set h[GetPlayerId(GetOwningPlayer(GetTriggerUnit()))] = GetTriggerUnit() )
Старый 30.11.2008, 14:10
Van Damm
wait... what?
offline
Опыт: 22,268
Активность:
Цитата:
зачем руками - создавай героев в определённом регионе, а на событие "A unit Enter Region" заноси Triggering Unit в массив под номером игрока(пример: set h[GetPlayerId(GetOwningPlayer(GetTriggerUnit()))] = GetTriggerUnit() )
ну фактически руками


marsh123, в твоем случае можно юзать немного измененный код swdn, но все-таки лучше заносить героев в массив руками при выборе - так уменьшится количество выполняемых в последствии операций
Код:
globals
  integer array heroes
  group gr = CreateGroup()
endglobals

function Enum takes nothing returns boolean
  if IsUnitType(GetFilterUnit(), UNIT_TYPE_HERO) then
    set heroes[GetPlayerId(GetOwningPlayer(GetFilterUnit()))] = GetUnitTypeId(GetFilterUnit())
  endif
  return false
endfunction

function DoSmthWithPlayersHero takes integer p returns nothing
  if (heroes[p] == 0) then
     call GroupEnumUnitsInRect(gr, bj_mapInitialPlayableArea, Filter(function Enum))
  endif

  if (heroes[p] == 'Emoo') then
     //...
  elseif (heroes[p] == 'Hblm') then
     //...
  else 
     //итд
  endif
endfunction
Старый 30.11.2008, 14:24
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
Тоесть отследить каким героем управляет игрок можно только через преднамеренное занесение в массив руками ? :(
я не понял что означает смайлик в конце... это так сложно?
Старый 30.11.2008, 14:35
marsh123
Member+
offline
Опыт: 1,219
Активность:
Почему-то не работает, в итоге должна задаться иконка для мультибоарда, сделал как вы сказали, также выкладываю ф-цию, которая задает имя игрока и рядом иконку, имя норм задалось, а у всех вместо иконки глаза..

Код:
function Enum takes nothing returns boolean
  if IsUnitType(GetFilterUnit(), UNIT_TYPE_HERO) then
    set heroes[GetPlayerId(GetOwningPlayer(GetFilterUnit()))] = GetUnitTypeId(GetFilterUnit())
  endif
  return false
endfunction

function ReturnIcon takes integer pid returns string
if (heroes[pid] == 0) then
     call GroupEnumUnitsInRect(gr, bj_mapInitialPlayableArea, Filter(function Enum))
  endif
if (heroes[pid] == 'Emoo') then
return "ReplaceableTextures\\CommandButtons\\BTNPriestessOfTheMoon.blp"
elseif (heroes[pid] == 'Hblm') then
return "ReplaceableTextures\\CommandButtons\\BTNHeroBloodElfPrince.blp"
else
return "ReplaceableTextures\\WorldEditUI\\Editor-Random-Unit.blp"
endif
endfunction

function NIMB takes integer o returns nothing // Эта функция заносит ники играющих игроков в MultiBoard.
local integer i = 0
local integer n = 0
local string pn
local multiboarditem mbi = null
loop
exitwhen i==o
if GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING then
set pn = PCO(i)
set mbi = MultiboardGetItem(udg_MyMB,n+1, 0)
call MultiboardSetItemValue(mbi, pn)
call MultiboardReleaseItem(mbi)
call MultiboardSetItemIcon(mbi, ReturnIcon(i)) 
set n = n + 1
endif
set i = i + 1
endloop
endfunction
Старый 30.11.2008, 15:00
Van Damm
wait... what?
offline
Опыт: 22,268
Активность:
А сами юниты на карте стоят? :)
Старый 30.11.2008, 15:04
marsh123
Member+
offline
Опыт: 1,219
Активность:
Van Damm
Да, стоит довольно много героев, каждому игроку по 1 герою, всего 12 игроков, 2 из этих героев - Мирана и Кровавый чародей или как там его..
Старый 30.11.2008, 15:06
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Код:
loop
// . . .
  call MultiboardSetItemValue(mbi, pn)
  call MultiboardSetItemIcon(mbi, ReturnIcon(i))
  // другие действия, связанные с ячейкой mbi
  // . . .
  call MultiboardReleaseItem(mbi) // функция очищает данные о ячейке мультиборда
  // она должна выполняться ПОСЛЕ всех действий, связанных с данной ячейкой
// . . .
endloop

Думаю, теперь все должно заработать.
Старый 30.11.2008, 15:17
marsh123
Member+
offline
Опыт: 1,219
Активность:
ShadoW DaemoN
Ой, блин, точно... Забыл про релиз :( щас проверю

marsh123 добавил:
Работает, тему можно закрыть :)

// тема кстати аццкая ^_^ 20666. © swdn.
Старый 30.11.2008, 15:19
Закрытая тема

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

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

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

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



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