fobas213

Пользователь

Регистрация: 09.01.2013

Сообщения: 128

Рейтинг: 213

fobas213

Регистрация: 09.01.2013

Сообщения: 128

Рейтинг: 213

ALTECHIE сказал(а):
а можно скрин? не очень понял
Нажмите, чтобы раскрыть...

fobas213

Пользователь

Регистрация: 09.01.2013

Сообщения: 128

Рейтинг: 213

fobas213

Регистрация: 09.01.2013

Сообщения: 128

Рейтинг: 213

Ciberius сказал(а):
Ребята после 00:00 сразу выкрикивает Radiant victory. Помогите решить проблему!
Нажмите, чтобы раскрыть...

либо троны близко друг к другу(было и такое), либо код скопирован из другого аддона и в нем игра кончалась при падении трона-которого у тебя нет

Ciberius

Пользователь

Регистрация: 10.08.2014

Сообщения: 8

Рейтинг: 0

Ciberius

Регистрация: 10.08.2014

Сообщения: 8

Рейтинг: 0

fobas213 сказал(а):
либо троны близко друг к другу(было и такое), либо код скопирован из другого аддона и в нем игра кончалась при падении трона-которого у тебя нет
Нажмите, чтобы раскрыть...

Я запускаю holdout_example

fobas213

Пользователь

Регистрация: 09.01.2013

Сообщения: 128

Рейтинг: 213

fobas213

Регистрация: 09.01.2013

Сообщения: 128

Рейтинг: 213

Ciberius сказал(а):
Я запускаю holdout_example
Нажмите, чтобы раскрыть...

ты в нее поиграть хочешь или на ее основе что то сделать?

ArrowOfGood

Пользователь

Регистрация: 09.08.2014

Сообщения: 13

Рейтинг: 1

ArrowOfGood

Регистрация: 09.08.2014

Сообщения: 13

Рейтинг: 1

ALTECHIE сказал(а):
а можно скрин? не очень понял
Нажмите, чтобы раскрыть...


если тебе нужно поменять только землю, выбери курсор и им выдели квадраты и нижней кнопкой применяется смена, при этом есть выбор земли

Ciberius

Пользователь

Регистрация: 10.08.2014

Сообщения: 8

Рейтинг: 0

Ciberius

Регистрация: 10.08.2014

Сообщения: 8

Рейтинг: 0

fobas213 сказал(а):
ты в нее поиграть хочешь или на ее основе что то сделать?
Нажмите, чтобы раскрыть...

На ее основе делаю.

edw

Пользователь

Регистрация: 05.07.2014

Сообщения: 81

Рейтинг: 10

edw

Регистрация: 05.07.2014

Сообщения: 81

Рейтинг: 10

L00na сказал(а):
Похоже, что ты забыл в файле "npc_heroes_custom" изменить название абилки на "sniper_assassinate_new"
Нажмите, чтобы раскрыть...

Да нет, всё правильно.

{

"npc_dota_hero_sniper_tempalte"

{


"override_hero"



"npc_dota_hero_sniper"





"Ability4"




"sniper_assassinate_new"


}
}

fobas213

Пользователь

Регистрация: 09.01.2013

Сообщения: 128

Рейтинг: 213

fobas213

Регистрация: 09.01.2013

Сообщения: 128

Рейтинг: 213

Ciberius сказал(а):
На ее основе делаю.
Нажмите, чтобы раскрыть...

тогда начни с этого:
1)выбери холдаут
2)кнопка создать кастом карту на его основе и далее в хамере по умолчанию карту

Ciberius

Пользователь

Регистрация: 10.08.2014

Сообщения: 8

Рейтинг: 0

Ciberius

Регистрация: 10.08.2014

Сообщения: 8

Рейтинг: 0

fobas213 сказал(а):
тогда начни с этого:
1)выбери холдаут
2)кнопка создать кастом карту на его основе и далее в хамере по умолчанию карту
Нажмите, чтобы раскрыть...

Я так и делаю. Но все равно выкрикивает Radiant Victory

fobas213

Пользователь

Регистрация: 09.01.2013

Сообщения: 128

Рейтинг: 213

fobas213

Регистрация: 09.01.2013

Сообщения: 128

Рейтинг: 213

Ciberius сказал(а):
Я так и делаю. Но все равно выкрикивает Radiant Victory
Нажмите, чтобы раскрыть...

хз, только что у себя запустил-все работает
папки не трогал аддоновские?

Ciberius

Пользователь

Регистрация: 10.08.2014

Сообщения: 8

Рейтинг: 0

Ciberius

Регистрация: 10.08.2014

Сообщения: 8

Рейтинг: 0

fobas213 сказал(а):
хз, только что у себя запустил-все работает
папки не трогал аддоновские?
Нажмите, чтобы раскрыть...

Нет, только мап сделал так как я хочу и все.

fobas213

Пользователь

Регистрация: 09.01.2013

Сообщения: 128

Рейтинг: 213

fobas213

Регистрация: 09.01.2013

Сообщения: 128

Рейтинг: 213

Ciberius сказал(а):
Нет, только мап сделал так как я хочу и все.
Нажмите, чтобы раскрыть...

то есть ты открыл существующий холдаут, перерисовал карту и она не запускается?
тогда проверь все ли строения на месте и правильно ли расположены трэки мобов

DeathGame

Пользователь

Регистрация: 04.07.2012

Сообщения: 672

Рейтинг: 185

DeathGame

Регистрация: 04.07.2012

Сообщения: 672

Рейтинг: 185

Да какой же блок блокирует лип мираны(((( столько блоков уже перепробовал((

Dark_Heart

Пользователь

Регистрация: 28.04.2013

Сообщения: 788

Рейтинг: 330

Dark_Heart

Регистрация: 28.04.2013

Сообщения: 788

Рейтинг: 330

Dark_Heart сказал(а):
Уже 3 день не могу загрузить дополнительные файлы для воркшопа, ничего не помогает, сами кастум карты я могу загрузить, но поиграть в них не могу и сам воркшоп не запускается...
Нажмите, чтобы раскрыть...

Так кто нибудь знает в чем проблема?

Дmитpий

Пользователь

Регистрация: 09.08.2014

Сообщения: 10

Рейтинг: 1

Дmитpий

Регистрация: 09.08.2014

Сообщения: 10

Рейтинг: 1

DeathGame сказал(а):
Да какой же блок блокирует лип мираны(((( столько блоков уже перепробовал((
Нажмите, чтобы раскрыть...

Сделай пошире свой блок

fobas213

Пользователь

Регистрация: 09.01.2013

Сообщения: 128

Рейтинг: 213

fobas213

Регистрация: 09.01.2013

Сообщения: 128

Рейтинг: 213

DeathGame сказал(а):
Да какой же блок блокирует лип мираны(((( столько блоков уже перепробовал((
Нажмите, чтобы раскрыть...

black и clip пробовал?
по ширине текстуры больше прыжка мираны?

DeathGame

Пользователь

Регистрация: 04.07.2012

Сообщения: 672

Рейтинг: 185

DeathGame

Регистрация: 04.07.2012

Сообщения: 672

Рейтинг: 185

fobas213 сказал(а):
black и clip пробовал?
по ширине текстуры больше прыжка мираны?
Нажмите, чтобы раскрыть...

мне не именно по ширине надо, есть такие места, куда мне надо чтоб игроки не липом попадали,а обходили и пешом попадали туда.

DeathGame

Пользователь

Регистрация: 04.07.2012

Сообщения: 672

Рейтинг: 185

DeathGame

Регистрация: 04.07.2012

Сообщения: 672

Рейтинг: 185

fobas213 сказал(а):
black и clip пробовал?
по ширине текстуры больше прыжка мираны?
Нажмите, чтобы раскрыть...

clipы пробовал, блэк сомнительно и мне кажется тоже ничего не даст

lomal

Пользователь

Регистрация: 10.08.2014

Сообщения: 12

Рейтинг: 0

lomal

Регистрация: 10.08.2014

Сообщения: 12

Рейтинг: 0

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

Dark_Heart

Пользователь

Регистрация: 28.04.2013

Сообщения: 788

Рейтинг: 330

Dark_Heart

Регистрация: 28.04.2013

Сообщения: 788

Рейтинг: 330

Вы меня игнорите или ответа никто не знает?

Kozhin2012

Пользователь

Регистрация: 15.07.2012

Сообщения: 831

Рейтинг: 198

Kozhin2012

Регистрация: 15.07.2012

Сообщения: 831

Рейтинг: 198

Ап.
По гайду делаю https://developer.valvesoftware.com...Tools/Scripting/Simple_Trigger_that_calls_Lua
Не догоняю что делать в шаге 4.

kro12

Пользователь

Регистрация: 10.08.2014

Сообщения: 5

Рейтинг: 0

kro12

Регистрация: 10.08.2014

Сообщения: 5

Рейтинг: 0

Kozhin2012 сказал(а):
Ап.
По гайду делаю https://developer.valvesoftware.com...Tools/Scripting/Simple_Trigger_that_calls_Lua
Не догоняю что делать в шаге 4.
Нажмите, чтобы раскрыть...

Разобрался. Скрипт должен лежать обязательно в "Папка_со_стимом"\SteamApps\common\dota 2 beta\dota_ugc\game\dota_addons\"имя_аддона"\scripts\vscripts

Ciberius

Пользователь

Регистрация: 10.08.2014

Сообщения: 8

Рейтинг: 0

Ciberius

Регистрация: 10.08.2014

Сообщения: 8

Рейтинг: 0

fobas213 сказал(а):
то есть ты открыл существующий холдаут, перерисовал карту и она не запускается?
тогда проверь все ли строения на месте и правильно ли расположены трэки мобов
Нажмите, чтобы раскрыть...

Проверил все на месте, но все равно выкрикивает Radiant Victory

Cyrus Tall

Пользователь

Регистрация: 11.07.2014

Сообщения: 120

Рейтинг: 18

Cyrus Tall

Регистрация: 11.07.2014

Сообщения: 120

Рейтинг: 18

Ciberius сказал(а):
Проверил все на месте, но все равно выкрикивает Radiant Victory
Нажмите, чтобы раскрыть...

Создай новый аддон на основе dota pvp, установи его по умолчанию, открой хаммер, нажми файл - открыть - название твоей карты, жми ф9, проверяй.

doter.ua

Пользователь

Регистрация: 04.07.2012

Сообщения: 547

Рейтинг: 214

doter.ua

Регистрация: 04.07.2012

Сообщения: 547

Рейтинг: 214

Копаясь в различных доках и исходниках приобрел немного знаний про Scripting, которые изложу в этом посте. (Вся работа в файле addon_game_mode.lua)
Вкратце о чем пойдет речь:
  • Обработка событий
  • Как получить доступ к герою
  • Что дает этот доступ? например можно изменить:

    1. Текущее ХП,
    2. Золото,
    3. Увеличить Макс. запас ХП и т.д.

Итак, в этой теме уже было пару сообщений про события, но объяснять другие пункты не рассказав про события будет неправильно.


1) Под событием подразумевается
блок кода, который будет выполнен, когда это событие произойдет.


2) К сожалению
список таких событий я не нашел. (Подсмотрел пару штук в Исходниках) например когда погибает юнит, когда герой кастует заклинание, когда герой респавнится и т.д.


3) Пример события это простая функция:

function ИмяМода:Имя_События(keys) // имя мода например DotaPvP (задается вначале)

Какие-нибудь действия
end
Где keys - ключи (для каждого события свои (см. пункт 4.2))

***********************************************************











4 пункт был
ОБНОВЛЕН
***********************************************************

4.1) Событию нужно написать слушателя
listener. Делается это в блоке
function ИмяМода:InitGameMode()


бла бла

ListenToGameEvent('имя_из_списка', Dynamic_Wrap(ИмяМода, 'Имя_события'), self)

бла бла

end

Где
имя_из_списка - https://developer.valvesoftware.com/wiki/Dota_2_Workshop_Tools/Scripting/Built-In_Engine_Events

Имя_события
- имя, которое должно совпадать с именем события в пункте 3 (оба выделены розовым)

4.2)
Общая схема работы со списком:
Элементы списка состоят из двух частей:

  • имя_из_списка например:
    • entity_killed
  • Аргументы (те самые ключи keys) - это не обязательный элемент. но если он присутствует, то вы можете получить их таким способом: keys.имя_аргумента


На скрине видно, что у нашего события есть 4 аргумента. Получим их:
function DotaPvP:onEntityKilled(keys)

print('[DotaPvP] AbilityUsed ' .. tostring( keys.entindex_killed ))

print('[DotaPvP] AbilityUsed ' .. tostring( keys.entindex_attacker ))

print('[DotaPvP] AbilityUsed ' .. tostring( keys.entindex_inflictor ))

print('[DotaPvP] AbilityUsed ' .. tostring( keys.damagebits ))
end
Сразу вывожу в консоль методом print(). А метод tostring() преобразовывает в строку Методы возвращают разные значения в зависимости от ситуации.
Например: Пикнут СФ, есть спавн крипов. наше событие - смерть entity когда сф убивает крипа с руки первые два аргумента заполняются, третий - nil четвертый = 0.
Если же СФ убивает скилом, то третий параметр получает значение как и первые два.
Четвертый параметр все время ноль, хз для чего эти damagebits.
То есть желательно затестить поведение аргументов перед их использованием.
Пару советов:
  • чтобы реализовать какую-либо идею нужно подобрать пару ключевых слов, по которым можно будет найти нужное событие в списке. (в нашем примере это Ability или used)
  • Используйте поиск на странице (например в chrome клавишами Ctrl + F) куда вбиваете ключевые слова из первого пункта.
  • Так же применимо для API методов.




5) В примере будем работать с событием
AbilityUsed - когда используется заклинание.
ИмяМетода -
DotaPvP.
В самом низу документа вставим нашу функцию:

function DotaPvP:AbilityUsed()

print('[DotaPvP] AbilityUsed')
end

Для начала просто выведем сообщение в консоль методом print('текст')


6) API методы из доков вольво
https://developer.valvesoftware.com/wiki/Dota_2_Workshop_Tools/Scripting/API
В разделе (по ссылке выше) список доступных методов.

  • Часть из них можно вызвать просто скопировав название и передав параметры



Название_Метода( параметр_1, параметр_2 )
  • Другая часть вызывается с помощью классов, методами которых они являются



чудо_класс
:Название_Метода( параметр_1, параметр_2 )


Все методы делятся по разделам, у раздела Global стоит описание "
Global functions. These can be called without any class" - могут вызываться без класса, то есть это та самая "первая часть", о которой я упоминал выше.

Однако есть разделы, в описании которых это
не указано, тем не менее методы от туда так же вызываются без классов. Впрочем, с опытом, можно легко определить: вызывается ли тот или иной метод без класса.


Итак возьмем метод
GameRules:SetGoldPerTick(5) где 5 - (число) кол-во золота, которое дается игроку за тик (просто капает со временем), GameRules - название раздела, SetGoldPerTick собственно сам метод. Между ними двоеточие - обязательный элемент.

Куда вставлять этот метод? туда же, где и слушатели listener (см. пункт 4)


7)
Теперь перейдем к самому интересному - доступ к герою.
Да да речь пойдет про методы, которые нуждаются в классе.
Официального описания я не нашел (Но раздел
scripting постоянно пополняется новыми разделами, надеюсь разрабы добавят инфы про нашу тему)

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

Прелесть в том, что сам класс
PlayerResource уже создан (наверно где-то в исходниках c++, да какая разница где, главное он есть) нужно всего лишь написать PlayerResource традиционное двоеточие и добавить метод из Раздела
CDOTA_PlayerResource

Возможно есть классы похожие на
PlayerResource которые обеспечат доступ ко всем "нуждающимся в классах методам" Но я только 3 дня назад поставил Workshop tools на закачку и сам еще толком не разобрался.


8) Итак в разделе
CDOTA_PlayerResource есть методы:
HasSelectedHero( число) - возвращает true\false если есть пикнутый герой (судя из названия)
GetSelectedHeroEntity( число) - возвращает класс, способный работать с методами из раздела CBaseEntity - собственно в нем и находятся методы, которые позволяют манипулировать над героем.

Объявим переменную
local hero = PlayerResource:GetSelectedHeroEntity( номер )
  • local - модификатор области видимости (сейчас это не важно)
  • hero - просто название (Герой интуитивно понятно, что для работы с героем)

Что касается HasSelectedHero этот метод используется для проверки, вдруг ни одного героя не пикнули, а мы попробуем вызвать метод, который использует пикнутых героев.

Эта проверка была в блоке кода, в котором я и нашел класс PlayerResource.

9) Итак мы получили переменную (класс)
hero с ее помощью сделаем следущее:
Все как раньше: ищем нужные методы в соответствующем разделе. (в случае с
hero в разделе CBaseEntity)
  • local maxHp = hero:GetMaxHealth() // текущий макс запас ХП.
  • hero:SetMaxHealth( maxHp + 500 )
    // ставим новый запас на 500 больше.
  • hero:SetHealth( maxHp + 500 )

    // текущее хп = макс запасу (фулл).

Все это дело в цикле (блок повторяющийся заданное кол-во раз) по итерации (один обход цикла) на каждого героя.

Так же будем добавлять золото

PlayerResource:ModifyGold(nPlayerID, 500, false, 1)
  • nPlayerID - id номер игрока (игроки нумеруются от 0) мы передаем переменную из цикла (это номер обхода цикла, т.е. если 10 игроков, то тело цикла сработает 10 раз и nPlayerID номер конкретного обхода.)
  • 500 - кол-во голды
  • false - boolean значение (надежное ли золото, которое не теряется при смерти)
  • последний параметр - хз, просто принимает число(в описании нет ничего)

Стоит отметить, что цикл срабатывает для всех героев, независимо от того кто кастанул, чтобы делать для каждого героя отдельно нужно знать ID player который кастанул. и для этого ID уже делать манипуляции, я же не задумывался над тем где взять Конкретный ID, а просто для примера взял цикл со всеми героями (тем более тестил все сам, у меня то был всего один герой.)

итак
ФУЛЛ КОД
Спойлер: "КОД"


print( "Dota PvP game mode loaded." )

if DotaPvP == nil then

DotaPvP = class({})
end
-- ACTIVATE
function Activate()

GameRules.DotaPvP = DotaPvP()

GameRules.DotaPvP:InitGameMode()
end
-- INIT
function DotaPvP:InitGameMode()

local GameMode = GameRules:GetGameModeEntity()


-- Enable the standard Dota PvP game rules

GameRules:GetGameModeEntity():SetTowerBackdoorProtectionEnabled( true )


-- Register Think

GameMode:SetContextThink( "DotaPvP:GameThink", function() return self:GameThink() end, 0.25 )


-- Register Game Events

GameRules:SetGoldPerTick(5)

--listeners

ListenToGameEvent('dota_player_used_ability', Dynamic_Wrap(DotaPvP, 'AbilityUsed'), self)

end
--------------------------------------------------------------------------------
function DotaPvP:GameThink()

return 0.25
end
function DotaPvP:AbilityUsed()
print('[DotaPvP] AbilityUsed')
-- Цикл от 0 до системной константы DOTA_MAX_TEAM_PLAYERS
for nPlayerID = 0, DOTA_MAX_TEAM_PLAYERS-1 do


if PlayerResource:HasSelectedHero( nPlayerID ) then



local hero = PlayerResource:GetSelectedHeroEntity( nPlayerID )





local maxHp = hero:GetMaxHealth()








hero:SetMaxHealth( maxHp + 500 )



hero:SetHealth( maxHp + 500 )



PlayerResource:ModifyGold(nPlayerID, 500, false, 1)




end

end
end


Спойлер: "КОД"




Если пост будет полезный можно закрепить в шапку :blush: