18

» WarCraft 3 / Проблема с тестом карты

konvan5, ну я так и понял, :D, хотяб Азы Программирования нужно знать не говоря уже о Системах Мемхаках Структур Делегатов Наследование Полиморфизм и прочее что новичкам не свойственно изучать
для этого и есть Статьи
18

» WarCraft 3 / Проблема с тестом карты

konvan5, может и так, а может и не верно, я захожу в синг и вижу что у карты есть потенциал, захожу в локале и тыкаю на галочки, смотрю, Да разработчик такое предусмотрел, а потом думаю как бы мне подобное реализовать, и ответ дает о себе знать
18

» WarCraft 3 / Проблема с тестом карты

human1, это неважно как писал код главное чтобы написать его правильно, если неправильно например выбрать всех игроков от 1 до 100 и проверить что-то там, это явно указывает на то что так нельзя делать
Игроков нужно выбирать исходя из Слотов предусмотренных игрой, например есть 2 клана
в первом клане 5 игроков и в 2 тоже 5 значит нужно проверить только 10 игроков а не 100
18

» WarCraft 3 / Зрители

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

» WarCraft 3 / Зрители

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

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

ну да ладно надеюсь пригодится кому Спасибо за Ответы.
18

» WarCraft 3 / Зрители

EugeAl, Просто Циклы :) Цикл Внутри Цикла так как не хочу писать конструкцию типа
if(i!=j)then
:)
18

» WarCraft 3 / Зрители

konvan5, а проблема в том что если не проверять Всяческие Мысли игроков которые могут как-то повлиять на 11 игрока или на Зрителя то они сломают этот слот игрока
18

» WarCraft 3 / Зрители

    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

» WarCraft 3 / Зрители

konvan5, ну предположим что Зритель это 11 игрок
Игроки смотрят на него как на Союзника
Враг смотрит на него тоже как на Союзника
Предположим что ктото открыл Зрителя в параметрах карты
но там никого нет (Открыто или Закрыто)
и тут он пишет команду -comp 11
что тогда?
Компьютер не может быть Зрителем для этого и есть
MAP_CONTROL_USER
а если это Игрок который там сидит то все нормально
поэтому стоит проверить и Дополнительные условия этого Слота
18

» WarCraft 3 / Зрители

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
но его нужно доработать так как Игроки нападают на других
18

» WarCraft 3 / Зрители

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

» WarCraft 3 / Зрители

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)
18

» WarCraft 3 / Зрители

konvan5, на мой взгляд получится Огромная функция по проверки Всего и Вся
а еще к 1 пункту проверить если ктото написал команду -Swap 3 11
это тоже надо проверить
а если они напишут -comp 11? там появится Компьютерный игрок
а если кто-то напишет -Swap 6 12? как тогда? Игрок будет играть за Врага? тоже непорядок
18

» WarCraft 3 / Зрители

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

» WarCraft 3 / Зрители

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
18

» WarCraft 3 / Отслеживание добычи золота

SharrKnen, если дать Апгрейд конкретному Юниту в РО то можно проверить это грейд для него если он у него есть или нет тоже через условие
там проверяется Уровень грейда конкретного игрока а если например игрок сидит в 7 слоте и у него есть герой который получил этот грейд и он не равен 0 то можно отследить Иначе ничего не делать
18

» WarCraft 3 / Привязка иконок к уровням способности

В РО Пиктограмма Одна
а Текст внутри способности можно менять, либо Мемхак юзать
18

» WarCraft 3 / Отслеживание добычи золота

ну это уже 2 ответа
Первое, Берем своего Работника и проверяем сколько Голды принес через
GetPlayerState(Player(0), PLAYER_STATE_GOLD_GATHERED) > 200
условие проверит сколько Голды Игрок добыл
а Второе Рандомный шанс от 1 до 1000 дать что-то этому игроку или создать что-то Для Работника
18

» WarCraft 3 / Проблема с тестом карты

Верно konvan5,
function InitCustomTeams takes nothing returns nothing
    // Force: TRIGSTR_005
    call SetPlayerTeam( Player(0), 0 )
    call SetPlayerTeam( Player(1), 0 )
    call SetPlayerTeam( Player(2), 0 )
    call SetPlayerTeam( Player(3), 0 )
говорит сама за себя
наверное первый раз открыл Редактор и начал писать чтото