Добавлен
Всем привет!
смотрел недавно на другие проекты и увидел в них Зрителей,
10 игроков для патча 1.26, 2 Клана и 2 Зрителя
ну и подумал тоже добавить их
есть 2 Клана которые враждуют друг с другом, это прописано в Свойства Клана
в первом клане расположены Игроки и непосредственно Компьютерный игрок в 11 слоте (10 на Jass)
и 2 Клан Враги 12 игрока(11 на Jass)
в обшем не стал изобретать Велосипед а начал переделывать то что написал
здесь 11 игрок свободен, в игре (в сингле) он не отобразится, в локалке тоже если не зайти в параметры и поставить Всех Зрителей
12 игрока не надо трогать он Враг для нас и для Союзников
по моим наблюдениям заметил что если выбрать
Зрителей после Поражения слот не появится
Всех Зрителей слот появится
Судья тоже появится
и Без зрителей не появится
Константы которые планирую использовать
constant mapflag            MAP_OBSERVERS                       = ConvertMapFlag(16)
constant mapflag            MAP_OBSERVERS_ON_DEATH              = ConvertMapFlag(32)
constant playerslotstate    PLAYER_SLOT_STATE_EMPTY             = ConvertPlayerSlotState(0)
constant playerslotstate    PLAYER_SLOT_STATE_PLAYING           = ConvertPlayerSlotState(1)
constant playerslotstate    PLAYER_SLOT_STATE_LEFT              = ConvertPlayerSlotState(2)
constant alliancetype       ALLIANCE_PASSIVE                = ConvertAllianceType(0)
constant alliancetype       ALLIANCE_SHARED_VISION          = ConvertAllianceType(5)
constant alliancetype       ALLIANCE_SHARED_VISION_FORCED   = ConvertAllianceType(9)
constant mapcontrol         MAP_CONTROL_USER                    = ConvertMapControl(0)
constant mapcontrol         MAP_CONTROL_COMPUTER                = ConvertMapControl(1)
constant mapcontrol         MAP_CONTROL_RESCUABLE               = ConvertMapControl(2)
constant mapcontrol         MAP_CONTROL_NEUTRAL                 = ConvertMapControl(3)
constant mapcontrol         MAP_CONTROL_CREEP                   = ConvertMapControl(4)
constant mapcontrol         MAP_CONTROL_NONE                    = ConvertMapControl(5)
if GetPlayerController(Player(10)) == ConvertMapControl(5) then
//если открыто или закрыто

if GetPlayerController(Player(10)) == ConvertMapControl(4) then
//Теоретически можно поставить через Бота на Платформе но это сомнительно
endif

if GetPlayerController(Player(10)) == ConvertMapControl(3) then
//если нейтрал
endif
if GetPlayerController(Player(10)) == ConvertMapControl(2) then
//если резерв
endif
if GetPlayerController(Player(10)) == ConvertMapControl(1) then
//если компьютер
endif
написал функцию которая и будет определять Кто есть Кто
function F_Init_Players takes nothing returns nothing
call FogMaskEnable(false)
call FogEnable(false)
set Loop[1] = 0
loop
exitwhen Loop[1] > GetPlayers() //from 1 to 12 == from 0 to 11
set Players[Loop[1]] = Player(Loop[1])
set Loop[2] = 0
loop
exitwhen Loop[2] > GetPlayers()

//здесь они должны стать Союзниками включая для Зрителя

set Loop[2] = Loop[2] + 1
endloop
set Loop[1] = Loop[1] + 1
endloop

if GetPlayerState(Players[10], ConvertPlayerState(11)) == 1 then //PLAYER_STATE_OBSERVER
if GetPlayerController(Players[10]) == ConvertMapControl(0) then //MAP_CONTROL_USER
set Observer = Players[10]
set Players[13] = Player(13) //наш союзник!
call SetPlayerController(Observer, ConvertMapControl(0))
call SetPlayerName(Observer,"Зритель")
call SetPlayerState(Observer,ConvertPlayerState(1),0)
call SetPlayerState(Observer,ConvertPlayerState(2),0)
call SetPlayerState(Observer,ConvertPlayerState(7),0)
call SetAllyColorFilterState(0)//Непонятно как ее использовать чтобы показала 16 Игрока как Союзника
call SetPlayerAlliance(Players[13],Players[11],ConvertAllianceType(0),false) //они враждуют друг с другом
call SetPlayerColor(Players[13],ConvertPlayerColor(10))

endif//MAP_CONTROL_USER
else//PLAYER_STATE_OBSERVER == 0

if GetPlayerSlotState(Players[10]) == ConvertPlayerSlotState(0) then//PLAYER_SLOT_STATE_EMPTY
if GetPlayerController(Players[10]) == ConvertMapControl(5) then

//здесь должен быть Компьютерный игрок и планирую его поставить Но на что нужно обращать внимание когда меняются Приоритеты?
//конечно можно поставить и bj_IsSinglePlayer на усмотрение

endif//MAP_CONTROL_NONE
endif
endif

endfunction
известно что
call SetPlayerAlliance(Players[Loop[1]-9],Players[Loop[2]-2],ConvertAllianceType(0),true)//Союзники
А теперь вопрос, Каким образом прописать все это дело чтобы было Относительно Компактно и при этом не занимало много строк и при этом учесть Всяческие мысли которые могу навредить 11 игроку и чтобы он тоже не навредил другим

со временем доработаю но пока что так

function F_Player_Alliance takes integer source, boolean UseReverse, integer target, integer Type, boolean UseTrueOrFalse returns nothing
call SetPlayerAlliance(Players[source],Players[target],ConvertAllianceType(Type),UseTrueOrFalse)
if UseReverse then
call SetPlayerAlliance(Players[target],Players[source],ConvertAllianceType(Type),UseTrueOrFalse)
endif
endfunction

function F_Init_Players takes nothing returns nothing
call FogMaskEnable(false)
call FogEnable(false)

set MapControl[0] = ConvertMapControl(0)//MAP_CONTROL_USER
set MapControl[1] = ConvertMapControl(0)//MAP_CONTROL_USER
set MapControl[2] = ConvertMapControl(0)//MAP_CONTROL_USER
set MapControl[3] = ConvertMapControl(0)//MAP_CONTROL_USER
set MapControl[4] = ConvertMapControl(0)//MAP_CONTROL_USER
set MapControl[5] = ConvertMapControl(0)//MAP_CONTROL_USER
set MapControl[6] = ConvertMapControl(0)//MAP_CONTROL_USER
set MapControl[7] = ConvertMapControl(0)//MAP_CONTROL_USER
set MapControl[8] = ConvertMapControl(0)//MAP_CONTROL_USER
set MapControl[9] = ConvertMapControl(0)//MAP_CONTROL_USER
set MapControl[11] = ConvertMapControl(1)//MAP_CONTROL_COMPUTER

set Loop[1] = 0
loop
exitwhen Loop[1] > GetPlayers()
set Players[Loop[1]] = Player(Loop[1])
//from 1 to 12 == from 0 to 11
if Players[Loop[1]] != Players[11] and Players[Loop[1]] != Players[10] then 
//исключение для 12 и 11 игрока
call SetPlayerState(Players[Loop[1]], PLAYER_STATE_RESOURCE_GOLD, 50)
endif
set Loop[1] = Loop[1] + 1
endloop

if GetPlayerSlotState(Players[10]) == ConvertPlayerSlotState(0) then//PLAYER_SLOT_STATE_EMPTY
if GetPlayerController(Players[10]) == ConvertMapControl(5) then//MAP_CONTROL_NONE
set MapControl[10] = ConvertMapControl(1)//MAP_CONTROL_COMPUTER
call SetPlayerController(Players[10], MapControl[10])
call SetPlayerName(Players[10],"Союзник")
call SetPlayerRacePreference(Players[10],RACE_PREF_NIGHTELF)
call SetPlayerTeam(Players[10],0)
set Loop[2] = 0
loop
exitwhen Loop[2] > GetPlayers() - 2
//чтоб игроки не нападали друг на друга
call F_Player_Alliance(Loop[2], true, 0, 0, true)
call F_Player_Alliance(Loop[2], true, 1, 0, true)
call F_Player_Alliance(Loop[2], true, 2, 0, true)
call F_Player_Alliance(Loop[2], true, 3, 0, true)
call F_Player_Alliance(Loop[2], true, 4, 0, true)
call F_Player_Alliance(Loop[2], true, 5, 0, true)
call F_Player_Alliance(Loop[2], true, 6, 0, true)
call F_Player_Alliance(Loop[2], true, 7, 0, true)
call F_Player_Alliance(Loop[2], true, 8, 0, true)
call F_Player_Alliance(Loop[2], true, 9, 0, true)
call F_Player_Alliance(Loop[2], true, 10, 0, true)
set Loop[2] = Loop[2] + 1
endloop
endif//MAP_CONTROL_NONE
endif

if GetPlayerState(Players[10], ConvertPlayerState(11)) == 1 then//PLAYER_STATE_OBSERVER
if GetPlayerController(Players[10]) == ConvertMapControl(0) then 
set MapControl[10] = ConvertMapControl(0)//MAP_CONTROL_USER
set Observer = Players[10]
set Players[13] = Player(13)//наш союзник!

call SetPlayerController(Players[10], MapControl[10])
call SetPlayerName(Players[10],"Зритель")
call SetPlayerName(Players[13],"Союзник")
call SetPlayerState(Players[10],ConvertPlayerState(7),0)//PLAYER_STATE_GIVES_BOUNTY
call SetPlayerColor(Players[13],ConvertPlayerColor(10))

call F_Player_Alliance(11, false, 10, 0, true)
//Враг не сможет атаковать Зрителя но игроков Да
//а Зритель будет смотреть на него как на врага как и игроки
call F_Player_Alliance(13, false, 11, 0, false)
//союзник будет смотреть на 12 игрока как на Врага
//13 игрок Союзник и он не умеет нападать на Зрителя или на Игроков
call F_Player_Alliance(10, false, 13, 0, true)
//для Зрителя 13 игрок Союзник

set Loop[3] = 0
loop
exitwhen Loop[3] > GetPlayers()-2
call F_Player_Alliance(Loop[3], true, 0, 0, true)//и на себе подобных
call F_Player_Alliance(Loop[3], true, 1, 0, true)
call F_Player_Alliance(Loop[3], true, 2, 0, true)
call F_Player_Alliance(Loop[3], true, 3, 0, true)
call F_Player_Alliance(Loop[3], true, 4, 0, true)
call F_Player_Alliance(Loop[3], true, 5, 0, true)
call F_Player_Alliance(Loop[3], true, 6, 0, true)
call F_Player_Alliance(Loop[3], true, 7, 0, true)
call F_Player_Alliance(Loop[3], true, 8, 0, true)
call F_Player_Alliance(Loop[3], true, 9, 0, true)
call F_Player_Alliance(Loop[3], true, 10, 0, true)//чтобы игроки не нападали на Зрителя
set Loop[3] = Loop[3] + 1
endloop

endif//MAP_CONTROL_USER
endif//PLAYER_STATE_OBSERVER


if IsMapFlagSet(MAP_RANDOM_RACES) then
call SetPlayerRacePreference(Players[0],ConvertRacePref(1))
call SetPlayerRacePreference(Players[1],ConvertRacePref(1))
call SetPlayerRacePreference(Players[2],ConvertRacePref(1))
call SetPlayerRacePreference(Players[3],ConvertRacePref(1))
call SetPlayerRacePreference(Players[4],ConvertRacePref(1))
call SetPlayerRacePreference(Players[5],ConvertRacePref(1))
call SetPlayerRacePreference(Players[6],ConvertRacePref(1))
call SetPlayerRacePreference(Players[7],ConvertRacePref(1))
call SetPlayerRacePreference(Players[8],ConvertRacePref(1))
call SetPlayerRacePreference(Players[9],ConvertRacePref(1))
call SetPlayerRacePreference(Players[11],ConvertRacePref(8))
endif

if IsMapFlagSet(MAP_RANDOM_HERO) then
call SetMapFlag(MAP_RANDOM_HERO, false)
endif

endfunction

Куча Строк кода вместо 1 Галочки в Свойствах Клана

globals
player Observer
player array Players
integer array Loop
mapcontrol array MapControl
endglobals

ну да ладно надеюсь пригодится кому Спасибо за Ответы.
`
ОЖИДАНИЕ РЕКЛАМЫ...
23
Похожие вопросы:

ответ
зрители и обсы не взаимодействуют ни с какими триггерами, они вне игры
ответ
GoJustGo, зрители это и есть те самые 2 игрока, просто в лтд за них компы, а если есть зрители, то они играют роль ботов, так же в доте.
ответ
Ну если взять стандартное мили 1х1, где обычно катки длятся 10-15 минут, то думаю афк на 2 минуты уничтожит игрока на первых 10 минутах. Если катка затянулась на полчаса, то афк 5-10 минут может уничтожить игрока. Если игра затянулась на 10 часов, то думаю, часок можно и поафкашить.
Вот тут афк на 6.5 часов было норм для игроков
Так что все зависит от игры, геймплея, условий, где это критично а где нет. Может быть у тебя будет не конкретное число минут для определения афк и передача войск союзнику, а прогрессирующая шкала, чем дальше катка тем дольше можно быть афк, ибо самая жара действий обычно происходит на старте-середине игры.
И я не уверен, что стоит кикать игрока, можно просто передать контроль союзникам, пока он не вернется. Но это уже твоя авторская идея и система, как посчитаешь правильным для своей карты.

И да, АФК - от англ. AFK = Away From Keyboard, что в переводе отошел от клавиатуры.

23
Без констант код нечитаемый, я уже запутался в этих Convert xxx ) и плюс массив Loop не объясняет названием своим, для чего он)
А после этого уже можно думать о компактности. Возможно что нибудь проще будет вынести в отдельную функцию ради сокрытия данных. И возможно не в одну...
Ответы (4)
18
EugeAl, это небольшой Набросок того как хочу реализовать
Массив Loop[1] и Loop[2] призван установить Союзы, Зрение и Умение покупать предметы из лавки
вот Код
set Loop[1] = 0
loop
exitwhen Loop[1] > GetPlayers() //from 1 to 12 == from 0 to 11
set Players[Loop[1]] = Player(Loop[1])
set Loop[2] = 0
loop
exitwhen Loop[2] > GetPlayers()

//call SetPlayerAlliance(Players[Loop[1]-9],Players[Loop[2]-2],ConvertAllianceType(0),true)//Союзники
//call SetPlayerAlliance(Players[Loop[2]-2],Players[Loop[1]-9],ConvertAllianceType(5),true)//Зрение
//call SetPlayerAlliance(Players[Loop[1]-9],Players[Loop[2]-2],ConvertAllianceType(4),true)//Умеют покупать предметы

//call SetPlayerAlliance(Players[Loop[2]-2],Players[10],ConvertAllianceType(0),true)//союзник
//call SetPlayerAlliance(Players[10],Players[Loop[2]-2],ConvertAllianceType(0),true)//союзник

//call SetPlayerAlliance(Players[Loop[1]-9],Player(13),ConvertAllianceType(0),true)//смотрю на 13 игрока как на союзника
//call SetPlayerAlliance(Player(13),Players[Loop[1]-9],ConvertAllianceType(0),true)//13 игрок смотрит на нас

set Loop[2] = Loop[2] + 1
endloop

set Loop[1] = Loop[1] + 1
endloop
23
Centyrion, так обзови их тогда - loop1 - allies, а loop2 - allyObservers ) например. Так намного понятнее будет) если не для себя, то для нас)
18
EugeAl, Просто Циклы :) Цикл Внутри Цикла так как не хочу писать конструкцию типа
if(i!=j)then
:)
23
Centyrion, не вижу в ней ничего плохого) ну да, на пару наносекунд дольше будет работать, ну и ладно)
25
Ответ на вопрос:
  1. Разобрать подробно задачу, цель, что ты хочешь, как это должно работать и выглядеть, очень детально.
  2. Разобрать возможные инструменты, которые тебе могут помочь в достижении своей цели, разные подходы (через стандартные настройки сценариев и кланов, установки и контроль через триггеры или jass).
  3. Определиться с итоговым решением и инструментом и вдумчиво реализовать.
  4. Готово.
Ответы (14)
18
konvan5, Ответ то Поверхностный
я думаю Так
1.Задача в том что нужно
Проверить всех игроков,
Далее проверить кто союзник и кто противник,
кто может видеть Здания Герои союзника - Противника,
Кто может покупать предметы а кто не может,
Как наш Зритель будет смотреть на игроков или Компьютерного Игрока в слоте где Игроки
Как игроки будут смотреть на Зрителя если у него есть Здание или Герой,
Как Враг будет смотреть на Зрителя и остальных игроков,
Проверить кто находится в 11 слоте и сказать 12 игроку(Враг) нападать на 11 игрока
Если 11 игрок Зритель 12 игрок не Должен нападать на Зрителя а например на 16 Игрока(PLAYER_NEUTRAL_PASSIVE)
Если 11 игрок Не играет или слот Открыт или Закрыт это тоже надо проверить
Если Игрок поставил например Галочку Рандомные Расы в Параметрах оно тоже влияет на 11 игрока это тоже проверить
для этого есть
if IsMapFlagSet(MAP_RANDOM_RACES) then
call SetPlayerRacePreference(Player(0),ConvertRacePref(1))
call SetPlayerRacePreference(Player(1),ConvertRacePref(1))
call SetPlayerRacePreference(Player(2),ConvertRacePref(1))
call SetPlayerRacePreference(Player(3),ConvertRacePref(1))
call SetPlayerRacePreference(Player(4),ConvertRacePref(1))
call SetPlayerRacePreference(Player(5),ConvertRacePref(1))
call SetPlayerRacePreference(Player(6),ConvertRacePref(1))
call SetPlayerRacePreference(Player(7),ConvertRacePref(1))
call SetPlayerRacePreference(Player(8),ConvertRacePref(1))
call SetPlayerRacePreference(Player(9),ConvertRacePref(1))
call SetPlayerRacePreference(Player(11),ConvertRacePref(8))
endif
а если он поставил и Рандомные Герои? это тоже проверить
//if IsMapFlagSet(MAP_RANDOM_HERO) then
//call SetMapFlag(MAP_RANDOM_HERO, false)
//endif
это только 1 Пункт и возможно я что-то Упустил, кхм.... любой запутается с таким списком
  1. Инструменты у меня под рукой а именно
IsMapFlagSet(MAP_RANDOM_HERO)
GetPlayerController(Player(10)) == ConvertMapControl(0)
IsMapFlagSet(MAP_RANDOM_RACES)
SetPlayerController(Players[10]
SetPlayerAlliance
SetPlayerColor
set Observer = Players[10]
set Players[15] = Player(15) //будет нашим союзником!
GetPlayerState(Players[10], ConvertPlayerState(11)) == 1 then //PLAYER_STATE_OBSERVER
GetPlayerController(Players[10]) == ConvertMapControl(0) then //MAP_CONTROL_USER

set Loop[1] = 0
loop
exitwhen Loop[1] > GetPlayers() //from 1 to 12 == from 0 to 11
set Players[Loop[1]] = Player(Loop[1])
а про подход тут не знаю, с одной стороны не Целесообразно впихать Все эти проверки в Одну Функцию
с другой стороны могу скажем так Разделить функции на Вспомогательные Функции которые будут принимать Аргументы и устанавливать Союзы например для 1 и 2 игрока
пример из этой функции вызвать функцию которая принимает Аргументы и за счет этих Аргументов она устанавливает Союзы
так как это функция может мне еще пригодится
установки и контроль через триггеры или jass).
про это тоже подумал, Никаких триггеров только функции и проверки на наличие чего Либо
этот подход более приятный так как не надо каждый раз плодить Одинаковые Строчки кода в Других функциях, Достаточно вызвать функцию которая отвечает за это
  1. тут и Остановился
не знаю как лучше это реализовать
18
konvan5, на мой взгляд получится Огромная функция по проверки Всего и Вся
а еще к 1 пункту проверить если ктото написал команду -Swap 3 11
это тоже надо проверить
а если они напишут -comp 11? там появится Компьютерный игрок
а если кто-то напишет -Swap 6 12? как тогда? Игрок будет играть за Врага? тоже непорядок
18
call SetPlayerStartLocation(Player(11),11)
call ForcePlayerStartLocation(Player(11),11)
call SetPlayerColor(Player(11),ConvertPlayerColor(11))
call SetPlayerRacePreference(Player(11),RACE_PREF_UNDEAD)
call SetPlayerRaceSelectable(Player(11),false) // нельзя менять Расу этого игрока
//но можно Играть за него через команду -Swap 1 12
call SetPlayerController(Player(11),MAP_CONTROL_COMPUTER)
25
Centyrion, ты снова не смог ответить на 1 вопрос. Ты сразу приступил к реализации, как это должно быть реализовано, и сам отвечаешь про реализацию... Но я так и не понял чего ты хочешь реализовать XD
Ты ответь словами, кто такой зритель? Чем он отличается от других игроков? Ты хочешь чтобы за зрителя в лобби кто-то мог встать, или внутри игры кто-то мог стать зрителем, или использовать вариковскую функцию зрителей? Ну даже если будет 1 большая функция, что в этом плохого? Вроде ничего плохого.
Единственное, ты можешь еще использовать циклы, там где идет перечень одинаковых действий с разницей в числе с шагом +1. И вместо 12 строк у тебя будет 2 строки (ну 3 если учитывать endloop).
25
Centyrion, -swap это ты про лобби говоришь? Или у тебя в карте есть подобный функционал? Если про лобби - то не вижу проблем. Если меняют компьютера на игрока а в карте так не задумывалось - люди сами себе дураки, можешь проверить в начале игры и если комп не на своем месте, завершить игру и сказать, чтобы игроки начинали с нормальными настройками и не баловались со -swap
18
konvan5, на первый вопрос я ответил что я пытаюсь реализовать и уже приступил к нему
вот небольшой участок кода
надеюсь кодом хоть будет понятно
call FogMaskEnable(false)
call FogEnable(false)

set MapControl[0] = ConvertMapControl(0)//MAP_CONTROL_USER
set MapControl[1] = ConvertMapControl(0)//MAP_CONTROL_USER
set MapControl[2] = ConvertMapControl(0)//MAP_CONTROL_USER
set MapControl[3] = ConvertMapControl(0)//MAP_CONTROL_USER
set MapControl[4] = ConvertMapControl(0)//MAP_CONTROL_USER
set MapControl[5] = ConvertMapControl(0)//MAP_CONTROL_USER
set MapControl[6] = ConvertMapControl(0)//MAP_CONTROL_USER
set MapControl[7] = ConvertMapControl(0)//MAP_CONTROL_USER
set MapControl[8] = ConvertMapControl(0)//MAP_CONTROL_USER
set MapControl[9] = ConvertMapControl(0)//MAP_CONTROL_USER
set MapControl[11] = ConvertMapControl(1)//MAP_CONTROL_COMPUTER

set Loop[1] = 0
loop
exitwhen Loop[1] > GetPlayers()
set Players[Loop[1]] = Player(Loop[1])
//от 1 до 12 == от 0 до 11
if Players[Loop[1]] != Players[11] and Players[Loop[1]] != Players[10] then //исключение для 12 и 11 игрока
call SetPlayerState(Players[Loop[1]], PLAYER_STATE_RESOURCE_GOLD, 50)
endif
set Loop[1] = Loop[1] + 1
endloop

if GetPlayerSlotState(Players[10]) == ConvertPlayerSlotState(0) then//PLAYER_SLOT_STATE_EMPTY
if GetPlayerController(Players[10]) == ConvertMapControl(5) then//MAP_CONTROL_NONE
set MapControl[10] = ConvertMapControl(1)//MAP_CONTROL_COMPUTER
call SetPlayerController(Players[10], MapControl[10])
call SetPlayerName(Players[10],"Союзник")
call SetPlayerRacePreference(Players[10],RACE_PREF_NIGHTELF)
call SetPlayerTeam(Players[10],0)
endif//MAP_CONTROL_NONE
endif

if GetPlayerState(Players[10], ConvertPlayerState(11)) == 1 then//PLAYER_STATE_OBSERVER
if GetPlayerController(Players[10]) == ConvertMapControl(0) then 
set MapControl[10] = ConvertMapControl(0)//MAP_CONTROL_USER
set Observer = Players[10]
set Players[13] = Player(13)//наш союзник!

call SetPlayerController(Observer, MapControl[10])
call SetPlayerName(Observer,"Зритель")
call SetPlayerState(Observer,ConvertPlayerState(7),0)//PLAYER_STATE_GIVES_BOUNTY
call SetPlayerColor(Players[13],ConvertPlayerColor(10))

call SetPlayerAlliance(Players[11],Observer,ConvertAllianceType(0),true)
//Враг не сможет атаковать Зрителя но игроков Да
//а Зритель будет смотреть на него как на врага как и игроки

call SetPlayerAlliance(Players[13],Players[11],ConvertAllianceType(0),false)
//союзник будет смотреть на 12 игрока как на Врага
//13 игрок Союзник и он не умеет нападать на Зрителя или на Игроков
call SetPlayerAlliance(Observer,Players[13],ConvertAllianceType(0),true)
//для Зрителя 13 игрок Союзник

set Loop[2] = 0
loop
exitwhen Loop[2] > GetPlayers()-2

call SetPlayerAlliance(Observer,Players[Loop[2]],ConvertAllianceType(0),true)
//Зритель смотрит на Игроков как на союзника
//и Игроки смотрят на Зрителя как на союзника
call SetPlayerAlliance(Players[Loop[2]],Observer,ConvertAllianceType(0),true)

//чтобы игроки не нападали на других

call SetPlayerAlliance(Players[Loop[2]],Players[0],ConvertAllianceType(0),true)
call SetPlayerAlliance(Players[Loop[2]],Players[1],ConvertAllianceType(0),true)
call SetPlayerAlliance(Players[Loop[2]],Players[2],ConvertAllianceType(0),true)
call SetPlayerAlliance(Players[Loop[2]],Players[3],ConvertAllianceType(0),true)
call SetPlayerAlliance(Players[Loop[2]],Players[4],ConvertAllianceType(0),true)
call SetPlayerAlliance(Players[Loop[2]],Players[5],ConvertAllianceType(0),true)
call SetPlayerAlliance(Players[Loop[2]],Players[6],ConvertAllianceType(0),true)
call SetPlayerAlliance(Players[Loop[2]],Players[7],ConvertAllianceType(0),true)
call SetPlayerAlliance(Players[Loop[2]],Players[8],ConvertAllianceType(0),true)
call SetPlayerAlliance(Players[Loop[2]],Players[9],ConvertAllianceType(0),true)



set Loop[2] = Loop[2] + 1
endloop




endif//MAP_CONTROL_USER
endif//PLAYER_STATE_OBSERVER
18
konvan5, про -swap Да, для этого предусмотрен этот блок кода
if GetPlayerSlotState(Players[10]) == ConvertPlayerSlotState(0) then//PLAYER_SLOT_STATE_EMPTY
if GetPlayerController(Players[10]) == ConvertMapControl(5) then//MAP_CONTROL_NONE
set MapControl[10] = ConvertMapControl(1)//MAP_CONTROL_COMPUTER
call SetPlayerController(Players[10], MapControl[10])
call SetPlayerName(Players[10],"Союзник")
call SetPlayerRacePreference(Players[10],RACE_PREF_NIGHTELF)
call SetPlayerTeam(Players[10],0)
endif//MAP_CONTROL_NONE
endif
но его нужно доработать так как Игроки нападают на других
25
Centyrion, если код работает как тебе надо, тогда и вопроса нет :)
И все же я не понял проблемы.
Да и про код есть странности... Типа как на зрителя может кто-то нападать если у зрителя нет войск, он же зритель :D
18
konvan5, ну предположим что Зритель это 11 игрок
Игроки смотрят на него как на Союзника
Враг смотрит на него тоже как на Союзника
Предположим что ктото открыл Зрителя в параметрах карты
но там никого нет (Открыто или Закрыто)
и тут он пишет команду -comp 11
что тогда?
Компьютер не может быть Зрителем для этого и есть
MAP_CONTROL_USER
а если это Игрок который там сидит то все нормально
поэтому стоит проверить и Дополнительные условия этого Слота
18
    constant playerslotstate    PLAYER_SLOT_STATE_EMPTY             = ConvertPlayerSlotState(0)
    constant playerslotstate    PLAYER_SLOT_STATE_PLAYING           = ConvertPlayerSlotState(1)
    constant playerslotstate    PLAYER_SLOT_STATE_LEFT              = ConvertPlayerSlotState(2)
а если Зритель решил Ливнуть? как тогда быть?
18
konvan5, а проблема в том что если не проверять Всяческие Мысли игроков которые могут как-то повлиять на 11 игрока или на Зрителя то они сломают этот слот игрока
23
Centyrion, я так скажу - все эти настройки имеют значение лишь для стандартных melee условий победы и поражения. Например, флаг map random hero используется в одном месте, чтобы создать игроку героя и это прописано в jass скрипте. потому со своими настройками игроков этот флаг можно игнорировать.
Также там прописаны настройки для ливнувших игроков, опять же если делать свои настройки, слив игроков можно игнорировать. Например, ливнет зритель, ну и что? Он просто зритель
Что касается команд типа swap итд, они из чата вводятся, правильно? Тогда можно просто исключить из события ввода чата 12 игрока или любого типа зрителя
когда я писал анти афк систему, я не заносил подобные настройки в массивы, (кроме пары настроек, не существующих в игре по дефолту) а просто в запусках событий и действиях прописал ифы, что игрок не зритель, не комп и имеет союзников людей, и все прекрасно работает ) в мульиплеере естественно)
25
Centyrion, как написали выше, если зритель ливнет - на игру это же никак не повлияет. Будет в том слоте комп - ну пусть и будет, никому не помешает. Он же зритель и войск у него нет. Будет он в "союзниках" - предположим, но надо делать так чтобы другие игроки не могли ему передавать управление, ресы передавать и тд и тп. А в остальном не вижу проблем.
18
со временем доработаю но пока что так

function F_Player_Alliance takes integer source, boolean UseReverse, integer target, integer Type, boolean UseTrueOrFalse returns nothing
call SetPlayerAlliance(Players[source],Players[target],ConvertAllianceType(Type),UseTrueOrFalse)
if UseReverse then
call SetPlayerAlliance(Players[target],Players[source],ConvertAllianceType(Type),UseTrueOrFalse)
endif
endfunction

function F_Init_Players takes nothing returns nothing
call FogMaskEnable(false)
call FogEnable(false)

set MapControl[0] = ConvertMapControl(0)//MAP_CONTROL_USER
set MapControl[1] = ConvertMapControl(0)//MAP_CONTROL_USER
set MapControl[2] = ConvertMapControl(0)//MAP_CONTROL_USER
set MapControl[3] = ConvertMapControl(0)//MAP_CONTROL_USER
set MapControl[4] = ConvertMapControl(0)//MAP_CONTROL_USER
set MapControl[5] = ConvertMapControl(0)//MAP_CONTROL_USER
set MapControl[6] = ConvertMapControl(0)//MAP_CONTROL_USER
set MapControl[7] = ConvertMapControl(0)//MAP_CONTROL_USER
set MapControl[8] = ConvertMapControl(0)//MAP_CONTROL_USER
set MapControl[9] = ConvertMapControl(0)//MAP_CONTROL_USER
set MapControl[11] = ConvertMapControl(1)//MAP_CONTROL_COMPUTER

set Loop[1] = 0
loop
exitwhen Loop[1] > GetPlayers()
set Players[Loop[1]] = Player(Loop[1])
//from 1 to 12 == from 0 to 11
if Players[Loop[1]] != Players[11] and Players[Loop[1]] != Players[10] then 
//исключение для 12 и 11 игрока
call SetPlayerState(Players[Loop[1]], PLAYER_STATE_RESOURCE_GOLD, 50)
endif
set Loop[1] = Loop[1] + 1
endloop

if GetPlayerSlotState(Players[10]) == ConvertPlayerSlotState(0) then//PLAYER_SLOT_STATE_EMPTY
if GetPlayerController(Players[10]) == ConvertMapControl(5) then//MAP_CONTROL_NONE
set MapControl[10] = ConvertMapControl(1)//MAP_CONTROL_COMPUTER
call SetPlayerController(Players[10], MapControl[10])
call SetPlayerName(Players[10],"Союзник")
call SetPlayerRacePreference(Players[10],RACE_PREF_NIGHTELF)
call SetPlayerTeam(Players[10],0)
set Loop[2] = 0
loop
exitwhen Loop[2] > GetPlayers() - 2
//чтоб игроки не нападали друг на друга
call F_Player_Alliance(Loop[2], true, 0, 0, true)
call F_Player_Alliance(Loop[2], true, 1, 0, true)
call F_Player_Alliance(Loop[2], true, 2, 0, true)
call F_Player_Alliance(Loop[2], true, 3, 0, true)
call F_Player_Alliance(Loop[2], true, 4, 0, true)
call F_Player_Alliance(Loop[2], true, 5, 0, true)
call F_Player_Alliance(Loop[2], true, 6, 0, true)
call F_Player_Alliance(Loop[2], true, 7, 0, true)
call F_Player_Alliance(Loop[2], true, 8, 0, true)
call F_Player_Alliance(Loop[2], true, 9, 0, true)
call F_Player_Alliance(Loop[2], true, 10, 0, true)
set Loop[2] = Loop[2] + 1
endloop
endif//MAP_CONTROL_NONE
endif

if GetPlayerState(Players[10], ConvertPlayerState(11)) == 1 then//PLAYER_STATE_OBSERVER
if GetPlayerController(Players[10]) == ConvertMapControl(0) then 
set MapControl[10] = ConvertMapControl(0)//MAP_CONTROL_USER
set Observer = Players[10]
set Players[13] = Player(13)//наш союзник!

call SetPlayerController(Players[10], MapControl[10])
call SetPlayerName(Players[10],"Зритель")
call SetPlayerName(Players[13],"Союзник")
call SetPlayerState(Players[10],ConvertPlayerState(7),0)//PLAYER_STATE_GIVES_BOUNTY
call SetPlayerColor(Players[13],ConvertPlayerColor(10))

call F_Player_Alliance(11, false, 10, 0, true)
//Враг не сможет атаковать Зрителя но игроков Да
//а Зритель будет смотреть на него как на врага как и игроки
call F_Player_Alliance(13, false, 11, 0, false)
//союзник будет смотреть на 12 игрока как на Врага
//13 игрок Союзник и он не умеет нападать на Зрителя или на Игроков
call F_Player_Alliance(10, false, 13, 0, true)
//для Зрителя 13 игрок Союзник

set Loop[3] = 0
loop
exitwhen Loop[3] > GetPlayers()-2
call F_Player_Alliance(Loop[3], true, 0, 0, true)//и на себе подобных
call F_Player_Alliance(Loop[3], true, 1, 0, true)
call F_Player_Alliance(Loop[3], true, 2, 0, true)
call F_Player_Alliance(Loop[3], true, 3, 0, true)
call F_Player_Alliance(Loop[3], true, 4, 0, true)
call F_Player_Alliance(Loop[3], true, 5, 0, true)
call F_Player_Alliance(Loop[3], true, 6, 0, true)
call F_Player_Alliance(Loop[3], true, 7, 0, true)
call F_Player_Alliance(Loop[3], true, 8, 0, true)
call F_Player_Alliance(Loop[3], true, 9, 0, true)
call F_Player_Alliance(Loop[3], true, 10, 0, true)//чтобы игроки не нападали на Зрителя
set Loop[3] = Loop[3] + 1
endloop

endif//MAP_CONTROL_USER
endif//PLAYER_STATE_OBSERVER


if IsMapFlagSet(MAP_RANDOM_RACES) then
call SetPlayerRacePreference(Players[0],ConvertRacePref(1))
call SetPlayerRacePreference(Players[1],ConvertRacePref(1))
call SetPlayerRacePreference(Players[2],ConvertRacePref(1))
call SetPlayerRacePreference(Players[3],ConvertRacePref(1))
call SetPlayerRacePreference(Players[4],ConvertRacePref(1))
call SetPlayerRacePreference(Players[5],ConvertRacePref(1))
call SetPlayerRacePreference(Players[6],ConvertRacePref(1))
call SetPlayerRacePreference(Players[7],ConvertRacePref(1))
call SetPlayerRacePreference(Players[8],ConvertRacePref(1))
call SetPlayerRacePreference(Players[9],ConvertRacePref(1))
call SetPlayerRacePreference(Players[11],ConvertRacePref(8))
endif

if IsMapFlagSet(MAP_RANDOM_HERO) then
call SetMapFlag(MAP_RANDOM_HERO, false)
endif

endfunction

Куча Строк кода вместо 1 Галочки в Свойствах Клана

globals
player Observer
player array Players
integer array Loop
mapcontrol array MapControl
endglobals

ну да ладно надеюсь пригодится кому Спасибо за Ответы.
Принятый ответ
Ответы (2)
13
Centyrion, Про систему не скажу, а вот что бы было читабельно помещай повторяющиеся действия в циклы.
function F_Init_Players takes nothing returns nothing
    local integer i = 0

    call FogMaskEnable(false)
    call FogEnable(false)

    loop
    exitwhen i >= 9
        set MapControl[i] = ConvertMapControl(0)//MAP_CONTROL_USER
        set i = i + 1
    endloop
    set i = 0
    set MapControl[11] = ConvertMapControl(1)//MAP_CONTROL_COMPUTER

    set Loop[1] = 0
    loop
    exitwhen Loop[1] > GetPlayers()
        set Players[Loop[1]] = Player(Loop[1])
        //from 1 to 12 == from 0 to 11
        if Players[Loop[1]] != Players[11] and Players[Loop[1]] != Players[10] then 
        //исключение для 12 и 11 игрока
        call SetPlayerState(Players[Loop[1]], PLAYER_STATE_RESOURCE_GOLD, 50)
        endif
        set Loop[1] = Loop[1] + 1
    endloop

    if GetPlayerSlotState(Players[10]) == ConvertPlayerSlotState(0) then//PLAYER_SLOT_STATE_EMPTY
        if GetPlayerController(Players[10]) == ConvertMapControl(5) then//MAP_CONTROL_NONE
            set MapControl[10] = ConvertMapControl(1)//MAP_CONTROL_COMPUTER
            call SetPlayerController(Players[10], MapControl[10])
            call SetPlayerName(Players[10],"Союзник")
            call SetPlayerRacePreference(Players[10],RACE_PREF_NIGHTELF)
            call SetPlayerTeam(Players[10],0)
            set Loop[2] = 0

        loop
        exitwhen Loop[2] > GetPlayers() - 2
            //чтоб игроки не нападали друг на друга
            call F_Player_Alliance(Loop[2], true, i, 0, true)
            set Loop[2] = Loop[2] + 1
            set i = i + 1
        endloop
        set i = 0
        endif//MAP_CONTROL_NONE
    endif

    if GetPlayerState(Players[10], ConvertPlayerState(11)) == 1 then//PLAYER_STATE_OBSERVER
        if GetPlayerController(Players[10]) == ConvertMapControl(0) then 
        set MapControl[10] = ConvertMapControl(0)//MAP_CONTROL_USER
        set Observer = Players[10]
        set Players[13] = Player(13)//наш союзник!

        call SetPlayerController(Players[10], MapControl[10])
        call SetPlayerName(Players[10],"Зритель")
        call SetPlayerName(Players[13],"Союзник")
        call SetPlayerState(Players[10],ConvertPlayerState(7),0)//PLAYER_STATE_GIVES_BOUNTY
        call SetPlayerColor(Players[13],ConvertPlayerColor(10))

        call F_Player_Alliance(11, false, 10, 0, true)
        //Враг не сможет атаковать Зрителя но игроков Да
        //а Зритель будет смотреть на него как на врага как и игроки
        call F_Player_Alliance(13, false, 11, 0, false)
        //союзник будет смотреть на 12 игрока как на Врага
        //13 игрок Союзник и он не умеет нападать на Зрителя или на Игроков
        call F_Player_Alliance(10, false, 13, 0, true)
        //для Зрителя 13 игрок Союзник

        set Loop[3] = 0
        loop
        exitwhen Loop[3] > GetPlayers()-2
            call F_Player_Alliance(Loop[3], true, i, 0, true)//и на себе подобных
            set Loop[3] = Loop[3] + 1
            set i = i + 1
        endloop
        set i = 0

        endif//MAP_CONTROL_USER
    endif//PLAYER_STATE_OBSERVER


    if IsMapFlagSet(MAP_RANDOM_RACES) then
        loop 
        exitwhen i >= 9
            call SetPlayerRacePreference(Players[i],ConvertRacePref(1))
            set i = i + 1
        endloop
        call SetPlayerRacePreference(Players[11],ConvertRacePref(8))
    endif

    if IsMapFlagSet(MAP_RANDOM_HERO) then
        call SetMapFlag(MAP_RANDOM_HERO, false)
    endif

endfunction
18
SoulRazor, тоже можно но не люблю Двойные Циклы, проще Запустить Один цикл и если нужно проверить например 8 игрока то я проверяю его, их не так много, всего 10 игроков, Зачем использовать меньше строк чем больше?
да и где-то я уже это видел..для Разнообразия написал так
Чтобы оставить комментарий, пожалуйста, войдите на сайт.