|
|
|
|
[Вопрос] Фильтр на произвольный выбор юнита
|
|
Ty3uK | Дата: Суббота, 03 Сентября 2011, 17:04:59 | Сообщение # 1 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Code function Trig_All_Random_Filter takes nothing returns boolean if ( not ( GetPlayerSlotState(Player(bj_forLoopAIndex - 1) == PLAYER_SLOT_STATE_PLAYING ) ) then return false endif return true endfunction
function Trig_All_Random_Actions takes nothing returns nothing if (IsPlayerInForce(GetLocalPlayer(), bj_FORCE_ALL_PLAYERS)) then DisplayTextToPlayer(GetLocalPlayer(), 0, 0, ( GetPlayerName(GetTriggerPlayer()) + ( " включил " + "|cFF008AFFAll Random|r" ) )) endif set bj_forLoopAIndex = 1 set bj_forLoopAIndexEnd = 12 loop exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd if ( Trig_All_Random_Filter() ) then unit u = CreateUnitAtLoc(Player(bj_forLoopAIndex - 1), udg_Hero[GetRandomInt(1, 9)], GetStartLocationLoc(GetPlayerStartLocation(Player(bj_forLoopAIndex - 1))), 180.00) if (GetLocalPlayer() == Player(bj_forLoopAIndex - 1)) then SetCameraPosition(GetLocationX(GetStartLocationLoc(GetPlayerStartLocation(GetLocalPlayer()))), GetLocationY(GetStartLocationLoc(GetPlayerStartLocation(GetLocalPlayer())))) endif if (IsPlayerInForce(GetLocalPlayer(), bj_FORCE_ALL_PLAYERS)) then DisplayTextToPlayer(GetLocalPlayer(), 0, 0, (udg_Player_Colors[GetPlayerId(Player(bj_forLoopAIndex - 1)) + 1] + ( GetPlayerName(Player(bj_forLoopAIndex - 1)) + "|r" ) ) + ( " выбрал " + GetUnitName(u))) endif u = null call SetPlayerTechMaxAllowed(Player(bj_forLoopAIndex - 1), 'HERO', 0) else endif set bj_forLoopAIndex = bj_forLoopAIndex + 1 endloop call DisableTrigger( GetTriggeringTrigger() ) endfunction
function InitTrig_All_Random takes nothing returns nothing set gg_trg_All_Random = CreateTrigger( ) call TriggerRegisterPlayerChatEvent( gg_trg_All_Random, Player(1), "-ar", true ) call TriggerAddAction( gg_trg_All_Random, function Trig_All_Random_Actions ) endfunction собственно вопрос- как можно сделать фильтр для произвольного выбора? GetRandomInt() работает плохо, в этом никто не сомневался. Все рав-коды героев занесены в переменную с массивом Hero[] при инициализации (это я думаю поняли все). Заранее спасибо
|
|
|
|
lawson | Дата: Суббота, 03 Сентября 2011, 18:32:04 | Сообщение # 2 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| аля гуи в тексте.
Добавлено (03 Сентябрь 2011, 18:32:04) --------------------------------------------- Тебе нужнен рандомный выбор героя? Это все делается элементарно.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Суббота, 03 Сентября 2011, 18:35:30 |
|
|
|
Ty3uK | Дата: Суббота, 03 Сентября 2011, 19:06:12 | Сообщение # 3 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Ну так просьба показать, как это делается. Или дать точку опоры Добавлено (03 Сентябрь 2011, 19:06:12) --------------------------------------------- Гуи в тексте будет выглядеть не так, если что.
|
|
|
|
lawson | Дата: Суббота, 03 Сентября 2011, 19:19:00 | Сообщение # 4 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Тогда секундочку. Я тебе код выложу сойдет? Добавлено (03 Сентябрь 2011, 19:19:00) ---------------------------------------------
Quote (Ty3uK) Гуи в тексте будет выглядеть не так, если что. Quote (Ty3uK) exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd Как скажешь.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Суббота, 03 Сентября 2011, 19:18:29 |
|
|
|
Ty3uK | Дата: Суббота, 03 Сентября 2011, 19:20:31 | Сообщение # 5 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Конечно, большое спасибо. А насчет а- на скорую руку делал, воткнул из старого тригга на гуи.
|
|
|
|
lawson | Дата: Суббота, 03 Сентября 2011, 19:33:54 | Сообщение # 6 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Кароче наработку долго искать пишу по памяти. И так событие: любое событие будь то время или игрок пишет -"ar" Действия globals integer array HeroId unit array PlayerHero //Герой для каждого игрока будет в переменной после создания героя. endglobals
function ANYFUNCTION takes nothing returns nothing local integer l = 0 local integer j = 0 set HeroId[1] = 'рав код первого героя' set HeroId[2] = 'рав код второго героя' set HeroId[3] = 'рав код третьего героя'
loop exitwhen l > 9 if GetPlayerSlotState(Player(l)) == PLAYER_SLOT_STATE_PLAYING then
loop exitwhen HeroId[j] != 0 set j = GetRandomInt(1, 3) endloop
set PlayerHero[l] = CreateUnit(Player(l), HeroId[j], GetRectCenterX(область создания юнита), GetRectCenterY(область создания юнита), GetRandomReal(0, 360)) set HeroId[j] = 0 endif
set l = l + 1 endloop endfunction
Держи. Эта наработка даст тебе выбор героев без повторения.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Суббота, 03 Сентября 2011, 19:45:31 |
|
|
|
Ty3uK | Дата: Суббота, 03 Сентября 2011, 19:52:55 | Сообщение # 7 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Спасибо огромное, сейчас опробую Добавлено (03 Сентябрь 2011, 19:52:55) --------------------------------------------- Что-то не работает...
|
|
|
|
lawson | Дата: Суббота, 03 Сентября 2011, 19:56:00 | Сообщение # 8 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Quote (Ty3uK) Что-то не работает... Что не работает ошибку выдает?Добавлено (03 Сентябрь 2011, 19:56:00) --------------------------------------------- Выложи код как ты сделал!
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
|
|
|
|
Ty3uK | Дата: Суббота, 03 Сентября 2011, 19:58:27 | Сообщение # 9 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Code globals integer array Hero unit array Player_Hero endglobals
function Trig_All_Random_Actions takes nothing returns nothing integer i = 0 integer j = 0 set udg_Hero[1] = 'E000' set udg_Hero[2] = 'E008' set udg_Hero[3] = 'E001' set udg_Hero[4] = 'E005' set udg_Hero[5] = 'H000' set udg_Hero[6] = 'H003' set udg_Hero[7] = 'H00H' set udg_Hero[8] = 'H009' set udg_Hero[9] = 'H008' if (IsPlayerInForce(GetLocalPlayer(), bj_FORCE_ALL_PLAYERS)) then DisplayTextToPlayer(GetLocalPlayer(), 0, 0, ( GetPlayerName(GetTriggerPlayer()) + ( " выбрал " + "|cFF008AFFAll Random|r" ) )) endif loop exitwhen i > 9 if (GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING) then loop exitwhen Hero[j] != 0 set j = GetRandomInt(1, 9) endloop Player_Hero[i] = CreateUnitAtLoc(Player(i), udg_Hero[j], GetStartLocationLoc(GetPlayerStartLocation(Player(i))), 180.00) if (GetLocalPlayer() == Player(i)) then SetCameraPosition(GetLocationX(GetStartLocationLoc(GetPlayerStartLocation(GetLocalPlayer()))), GetLocationY(GetStartLocationLoc(GetPlayerStartLocation(GetLocalPlayer())))) endif if (IsPlayerInForce(GetLocalPlayer(), bj_FORCE_ALL_PLAYERS)) then DisplayTextToPlayer(GetLocalPlayer(), 0, 0, (udg_Player_Colors[GetPlayerId(Player(i)) + 1] + ( GetPlayerName(Player(i)) + "|r" ) ) + ( " выбрал " + GetUnitName(Player_Hero[i]))) endif i += 1 endloop call DisableTrigger( GetTriggeringTrigger() ) endfunction
function InitTrig_All_Random takes nothing returns nothing set gg_trg_All_Random = CreateTrigger( ) call TriggerRegisterPlayerChatEvent( gg_trg_All_Random, Player(1), "-ar", true ) call TriggerAddAction( gg_trg_All_Random, function Trig_All_Random_Actions ) endfunction где трабла?Добавлено (03 Сентябрь 2011, 19:58:27) --------------------------------------------- Нет, чекер не ругается. Но при вводе только пишет, что синий игрок активировал рандом
|
|
|
|
lawson | Дата: Суббота, 03 Сентября 2011, 19:59:39 | Сообщение # 10 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Ty3uK, когда ты устанавливаешь глобальные переменные через globals то они не нуждаются в присатвке udg_ так что ее убери.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Суббота, 03 Сентября 2011, 19:59:58 |
|
|
|
Ty3uK | Дата: Суббота, 03 Сентября 2011, 20:01:52 | Сообщение # 11 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Ок, но дело не в этом до этого они у меня при инициализации устанавливались. Из-за этого трабла не может быть
|
|
|
|
lawson | Дата: Суббота, 03 Сентября 2011, 20:17:46 | Сообщение # 12 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
|
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Суббота, 03 Сентября 2011, 20:22:39 |
|
|
|
Ty3uK | Дата: Суббота, 03 Сентября 2011, 20:19:16 | Сообщение # 13 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Начнем с того, что парсер cJass позволяет это делать. Я не забыл- я их специально не ставлю. Большое спасибо, все заработало. Когда смогу- поставлю плюс
|
|
|
|
lawson | Дата: Суббота, 03 Сентября 2011, 20:19:35 | Сообщение # 14 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Так и сказал бы. Пфф
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Суббота, 03 Сентября 2011, 20:19:43 |
|
|
|
Ty3uK | Дата: Суббота, 03 Сентября 2011, 20:20:13 | Сообщение # 15 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Мой код "полноценный" ;-) все способности так делаю, ничего, все работает
|
|
|
|
lawson | Дата: Суббота, 03 Сентября 2011, 20:20:36 | Сообщение # 16 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Ty3uK, У меня на карте такое же но через структуру все делается.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
|
|
|
|
Ty3uK | Дата: Суббота, 03 Сентября 2011, 20:20:38 | Сообщение # 17 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Тему можно закрывать
|
|
|
|
lawson | Дата: Суббота, 03 Сентября 2011, 20:23:35 | Сообщение # 18 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Действительно както не заметил с самого начала что ты без call пишешь функции.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Суббота, 03 Сентября 2011, 20:24:50 |
|
|
|
Hexing | Дата: Понедельник, 05 Сентября 2011, 16:12:02 | Сообщение # 19 |
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки:
| или я не в теме, или да, но с cJass-ом можно без "call" писать вызов функции
|
|
|
|
Ty3uK | Дата: Вторник, 06 Сентября 2011, 08:11:56 | Сообщение # 20 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Да, именно так. Он не заметил сначала
|
|
|
|
[DUОS] | Дата: Вторник, 06 Сентября 2011, 18:16:28 | Сообщение # 21 |
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
| Ty3uK, Твой код не даст гарантии точной работы. Ответь, например, на вопрос - если синим игроком управляет не человек, что в этом случае? Тут нужно автоопределение того, где находится этот игрок. Плюс ко всему, могут попадаться одинаковые юниты; эта проблема решаема. Цвета игроков приятнее в цвете
Code function FirstOfPlaying takes nothing returns player local integer i = 0 local player p loop exitwhen i > 11 set p = Player(i) if GetPlayerSlotState(p) == PLAYER_SLOT_STATE_PLAYING and GetPlayerController(p) == MAP_CONTROL_USER then set i = 11 endif set i = i + 1 endloop return p endfunction
function GetPlayerNameColored takes player p returns string local playercolor col=GetPlayerColor(p) local string r=GetPlayerName(p) if GetPlayerId(p) == 12 then set r="the |CFF333429"+r+"|r" elseif GetPlayerId(p) == 13 then set r="the |cffc1c1ff"+r+"|r" elseif GetPlayerId(p) == 14 then set r="the |CFF333429"+r+"|r" elseif GetPlayerId(p) == 15 then set r="the |CFF333429"+r+"|r" elseif col == PLAYER_COLOR_RED then set r="|CFFFF0303"+r+"|r" elseif col == PLAYER_COLOR_BLUE then set r="|CFF0042FF"+r+"|r" elseif col == PLAYER_COLOR_CYAN then set r="|CFF1CE6B9"+r+"|r" elseif col == PLAYER_COLOR_PURPLE then set r="|CFF540081"+r+"|r" elseif col == PLAYER_COLOR_YELLOW then set r="|CFFFFFC00"+r+"|r" elseif col == PLAYER_COLOR_ORANGE then set r="|CFFFE8A0E"+r+"|r" elseif col == PLAYER_COLOR_GREEN then set r="|CFF20C000"+r+"|r" elseif col == PLAYER_COLOR_PINK then set r="|cffff80c0"+r+"|r" elseif col == PLAYER_COLOR_LIGHT_GRAY then set r="|CFF959697"+r+"|r" elseif col == PLAYER_COLOR_LIGHT_BLUE then set r="|CFF7FBFF1"+r+"|r" elseif col == PLAYER_COLOR_AQUA then set r="|cFF106246"+r+"|r" elseif col == PLAYER_COLOR_BROWN then set r="|cFF4E2A04"+r+"|r" else set r="" endif set col=null return r endfunction
function IsHeroTypeAvailable takes integer min, integer max returns boolean local integer i = min loop exitwhen i > max if LoadBoolean(udg_hash,GetUnitTypeId(udg_Hero[i]),0) != true then return true endif set i = i + 1 endloop return false endfunction
function PickRandomUnitType takes integer min, integer max returns integer local integer rnd local integer utype // Кто-то может ввести min большее, чем max. Не стоит его за это корить, // мы просто поменяем их местами, чтобы избежать проблем. if min > max then set rnd = min set max = min set min = rnd endif if IsHeroTypeAvailable(min,max) then // Этот цикл обязательно возвратит нам тип юнита, так как первое условие // исключает его бесконечность. loop set rnd = GetRandomInt(min,max) set utype = GetUnitTypeId(udg_Hero[rnd]) if LoadBoolean(udg_hash,utype,0) != true then call SaveBoolean(udg_hash,utype,0,true) return utype endif endloop else call DisplayTextToPlayer(GetLocalPlayer(),0,0,"|cffffcc00Ошибка - доступных типов героев меньше, чем игроков.|r") endif return 0 endfunction
function Trig_All_Random_Actions takes nothing returns nothing local integer i = 0 local real x local real y local unit u local player p call DisplayTextToPlayer(GetLocalPlayer(),0,0,GetPlayerNameColored(GetTriggerPlayer()) + " включил |cFF008AFFAll Random|r") loop exitwhen i > 11 set p = Player(i) if GetPlayerSlotState(p) == PLAYER_SLOT_STATE_PLAYING then set x = GetStartLocationX(GetPlayerStartLocation(p)) set y = GetStartLocationY(GetPlayerStartLocation(p)) if GetLocalPlayer() == p then call PanCameraToTimed(x,y,0.) endif set u = CreateUnit(p,PickRandomUnitType(1,9),x,y,180.) call DisplayTextToPlayer(GetLocalPlayer(),0,0,GetPlayerNameColored(p) + " выбрал " + GetUnitName(u)) call SetPlayerTechMaxAllowed(p,'HERO',0) endif set i = i + 1 endloop call DisableTrigger(GetTriggeringTrigger()) set p = null endfunction
function InitTrig_All_Random takes nothing returns nothing set gg_trg_All_Random = CreateTrigger() call TriggerRegisterPlayerChatEvent(gg_trg_All_Random,FirstOfPlaying(),"-ar",true) call TriggerAddAction(gg_trg_All_Random,function Trig_All_Random_Actions) endfunction Вот рабочий -ar на чистом Jass. Всё, что над функцией Trig_All_Random_Actions, заносится в кастом код карты. Требует также проинициализированного хеша.
Сообщение отредактировал [DUОS] - Вторник, 06 Сентября 2011, 18:18:01 |
|
|
|
lawson | Дата: Вторник, 06 Сентября 2011, 18:19:37 | Сообщение # 22 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Quote (|DUОS|) Плюс ко всему, могут попадаться одинаковые юниты Как могут? там же написано что рав код юнита в массиве после создания обнуляется!?
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
|
|
|
|
[DUОS] | Дата: Вторник, 06 Сентября 2011, 18:24:01 | Сообщение # 23 |
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
| Quote (lawson) там же написано что рав код юнита в массиве после создания обнуляется!? Ещё лучше... Ты представь себе - будет создавать юнита null. Весело.
|
|
|
|
lawson | Дата: Вторник, 06 Сентября 2011, 18:47:12 | Сообщение # 24 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Quote (|DUОS|) Ещё лучше... Ты представь себе - будет создавать юнита null. Весело. не тупи. там условие что в ячейке массива число не равное 0.
loop exitwhen l > 9 if GetPlayerSlotState(Player(l)) == PLAYER_SLOT_STATE_PLAYING then
loop exitwhen HeroId[j] != 0 set j = GetRandomInt(1, 3) endloop
set PlayerHero[l] = CreateUnit(Player(l), HeroId[j], GetRectCenterX(область создания юнита), GetRectCenterY(область создания юнита), GetRandomReal(0, 360)) set HeroId[j] = 0 endif
set l = l + 1 endloop
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
|
|
|
|
[DUОS] | Дата: Вторник, 06 Сентября 2011, 23:15:39 | Сообщение # 25 |
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
| Quote (lawson) loop exitwhen HeroId[j] != 0 set j = GetRandomInt(1, 3) endloop Вариант, так можно обойтись без хэша, но смотри - возникает проблема бесконечного цикла, когда все Hero в ранже уже null.
|
|
|
|
|
|
|
|
|
|
|