CustomGames.ru - Dota 2 пользовательские игры

Создание башни

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн tasman208

  • 128
  • Мощь: 0
Создание башни
« : 03-04-2016, 16:56:50 »
Делаю скрипт на создание мини башни на месте игрока предметом вот код для ее спавна, но спавнит он башню не на месте героя а в центре карты, почему так?
Код

function tower()
  if _G.team == 1 then
    local player = PlayerResource:GetPlayer(0.5)
    local pos = player:GetAbsOrigin()
    local unit = CreateUnitByName("npc_dota_tower_good", pos, true, nil, nil, DOTA_TEAM_GOODGUYS )
    else
    local player = PlayerResource:GetPlayer(0.5)
    local pos = player:GetAbsOrigin()
    local unit = CreateUnitByName("npc_dota_tower_bad", pos, true, nil, nil, DOTA_TEAM_BADGUYS )
  end     
end
Crusade Commanders

Оффлайн Илья

  • Супермодератор
  • 1892
  • Мощь: 16
Re: Создание башни
« Ответ #1 : 03-04-2016, 19:18:42 »
Почему в GetPlayer() указываешь 0.5? Там же id героя нужен.

Оффлайн CryDeS

  • Друзья CG
  • 1194
  • Мощь: 11
Re: Создание башни
« Ответ #2 : 03-04-2016, 19:20:52 »
Делаю скрипт на создание мини башни на месте игрока предметом вот код для ее спавна, но спавнит он башню не на месте героя а в центре карты, почему так?
Код

function tower()
  if _G.team == 1 then
    local player = PlayerResource:GetPlayer(0.5)
    local pos = player:GetAbsOrigin()
    local unit = CreateUnitByName("npc_dota_tower_good", pos, true, nil, nil, DOTA_TEAM_GOODGUYS )
    else
    local player = PlayerResource:GetPlayer(0.5)
    local pos = player:GetAbsOrigin()
    local unit = CreateUnitByName("npc_dota_tower_bad", pos, true, nil, nil, DOTA_TEAM_BADGUYS )
  end     
end
Ты путаешь понятия игрока и героя. Игрок всегда находится в центре карты, и он управляет героем.
Получай героя через
Код
local hero = player:GetAssignedHero() 
а от него бери координаты через hero:GetAbsOrigin()

Оффлайн tasman208

  • 128
  • Мощь: 0
Re: Создание башни
« Ответ #3 : 03-04-2016, 20:16:55 »
Переделал, но все равно вышка спавнится в центре карты
Код
function tower()
  if _G.team == 1 then
  local i = 0
  if PlayerResource:IsValidPlayer(i) then
    local player = PlayerResource:GetPlayer(i)
    local hero = player:GetAssignedHero()
    local pos = hero:GetAbsOrigin()
    local unit = CreateUnitByName("npc_dota_tower_good", pos + RandomVector( RandomFloat( 0, 200 ) ), true, nil, nil, DOTA_TEAM_GOODGUYS )
end
end
end
Crusade Commanders

Оффлайн Илья

  • Супермодератор
  • 1892
  • Мощь: 16
Re: Создание башни
« Ответ #4 : 03-04-2016, 20:23:06 »
Скинь где и как ты вызываешь эту функцию.

Ну и сейчас у тебя код проверяет только игрока с индексом 0, а  их может быть больше. Но это не должно влиять на твой спавн, нулевой игрок всегда есть.
« Последнее редактирование: 03-04-2016, 20:25:09 от Илья »

Оффлайн tasman208

  • 128
  • Мощь: 0
Re: Создание башни
« Ответ #5 : 03-04-2016, 20:38:49 »
Код
"item_tower_create"
{
"BaseClass" "item_datadriven"
"ID" "2009"
"AbilityTextureName" "item_tower_create"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"

"AbilityCooldown" "180"

"ItemKillable"                  "1"
"ItemSellable"                  "1"
"ItemDroppable"                 "1"
"ItemPermanent" "0"

"ItemCost" "5000"
"ItemStackable" "1"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemInitialCharges" "1"

"AbilitySpecial"
{
"01"
{
"var_type" "FIELD_INTEGER"
"duration" "6"
}
}

"OnSpellStart"
{
"RunScript"
{
"ScriptFile" "script"
"Function" "tower"
}
"SpendCharge"
{}
}
}
И еще вопрос. Как узнать id героя, который использовал предмет, чтобы использовать его тут?
Код
 function Activate()
    ListenToGameEvent("dota_player_used_ability", OnUsed, nil)
 end
 
 function OnUsed()
    if PlayerResource:IsValidPlayer(0) then
      local player = PlayerResource:GetPlayer(0)
      local num = player:GetTeamNumber()
      local name =  GetTeamName(num)
        if name == "#DOTA_GoodGuys" then
          _G.team = 1
        else
          _G.team = 2
        end
    end
 end
« Последнее редактирование: 03-04-2016, 21:45:18 от tasman208 »
Crusade Commanders

Оффлайн CryDeS

  • Друзья CG
  • 1194
  • Мощь: 11
Re: Создание башни
« Ответ #6 : 04-04-2016, 05:45:47 »
И еще вопрос. Как узнать id героя, который использовал предмет, чтобы использовать его тут?

Ты должен кое что знать о передаче функций в луа, у них есть параметры, так называемые ключи, или они же аргументы события. Их посмотреть можно довольно просто.

В datadriven-скилле/предмете.
Код
"OnSpellStart"
{
"RunScript"
{
"ScriptFile" "script"
"Function" "tower"
                                "MyArgument1" "5"
                                "MyArgument2" "blabla"
                                "MyArgument3" "%AbilityDamage"
}
"SpendCharge"
{}
}

Тогда в скрипте мы принимает событие вызова скрипта:
Код
function tower(keys)
local arg1 = keys.MyArgument1 -- сами передали из datadriven
local arg2 = keys.MyArgument2 -- сами передали из datadriven
local art3 = keys.MyArgument3 -- сами передали из datadriven
local caster = keys.caster -- автоматические передает сам datadriven БЕЗ нашего участия
local ability = keys.ability -- автоматические передает сам datadriven БЕЗ нашего участия
local player = caster:GetPlayerOwner() -- получим игрока отвечающего за кастера, если таковой существует, в противном случае получим nil(нулевой указатель)

for keyname, keyvalue in pairs(keys) do -- мы пройдемся по всем передаваемым ключам сюда для их просмотра и вывода их в консоль, вместе с их значениями.
print(keyname, keyvalue)
end


--[[
тут другие действия твоей абилки
]]
end

P.S. Герой(hero) и игрок(player) разные сущности, абсолютно. Игрок не может использовать способности, это делает герой/юнит. Но у игрока есть список подконтрольных ему юнитов.
P.S.S. Если все же нужен айди игрока то используй unit:GetPlayerOwnerID()
« Последнее редактирование: 04-04-2016, 05:47:30 от CryDeS »

Оффлайн tasman208

  • 128
  • Мощь: 0
Re: Создание башни
« Ответ #7 : 04-04-2016, 10:13:31 »
С башней не работает так же как с определением команды пишет ошибку при попытке создать башню
 [ W VScript              ]: Script Runtime Error: ...ota_addons\crusadecommanders\scripts\vscripts\script.lua:87: Parameter type mismatch
[ W VScript              ]: stack traceback:
[ W VScript              ]:    [C]: in function 'GetPlayer'

Вот код
Код
function tower(keys)
  if _G.team == 1 then
    local player = PlayerResource:GetPlayer(keys.PlayerID)
    local hero = player:GetAssignedHero()
    local pos = hero:GetAbsOrigin()
    local unit = CreateUnitByName("npc_dota_tower_good", pos + RandomVector( RandomFloat( 0, 200 ) ), true, nil, nil, DOTA_TEAM_GOODGUYS )
    else
    local player = PlayerResource:GetPlayer(keys.PlayerID)
    local hero = player:GetAssignedHero()
    local pos = hero:GetAbsOrigin()
    local unit = CreateUnitByName("npc_dota_tower_bad", pos + RandomVector( RandomFloat( 0, 200 ) ), true, nil, nil, DOTA_TEAM_BADGUYS )
  end     
end
Что тут нужно передавать в GetPlayer ?
Crusade Commanders

Оффлайн CryDeS

  • Друзья CG
  • 1194
  • Мощь: 11
Re: Создание башни
« Ответ #8 : 04-04-2016, 10:37:30 »
С башней не работает так же как с определением команды пишет ошибку при попытке создать башню

Вот код
Что тут нужно передавать в GetPlayer ?
PlayerResource и ID игрока как аргумент.  Я использую так:
Код
local player = PlayerResource:GetPlayer(playerid)
Думаю у тебя нету Keys.PlayerID, проверь таблицу keys на наличие этого поля.
И блин, зачем ты получаешь героя через игрока. Делай наоборот, тот кто скастовал умение идет всегда как кастер: keys.caster , а если это крип подконтрольный герою то используй keys.caster:GetOwnerEntity() для получения героя, или keys.caster:GetPlayerOwner() что бы получить игрока, или keys.caster:GetPlayerOwnerID() для получения ID игрока.

Оффлайн tasman208

  • 128
  • Мощь: 0
Re: Создание башни
« Ответ #9 : 04-04-2016, 11:13:57 »
Мне нужно узнать координаты героя, чтобы перед ним поставить башню,  но ничего из этого не дает координаты героя
Crusade Commanders

Оффлайн Илья

  • Супермодератор
  • 1892
  • Мощь: 16
Re: Создание башни
« Ответ #10 : 04-04-2016, 11:38:32 »
Ох, парень, блин. Даешь огрызок кода и спрашиваешь,  что не так. Для полноценной картины нужна вся цепочка: от главного скрипта до тела твоей функции.

Если ты хочешь реализовать предмет,  что создает башню в точке: просто реализуешь создание башни через эту точку.

Но ты зачем-то геморойничаешь: делаешь абилку без цели, чтобы она именно перед носом игрока создавала башню. Ладно, хорошо, давай погеморойничаем.

Вот твоя вещь:
Код

"item_tower_create"
{
"BaseClass" "item_datadriven"
"ID" "2009"
"AbilityTextureName" "item_tower_create"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"

"AbilityCooldown" "180"

"ItemKillable"                  "1"
"ItemSellable"                  "1"
"ItemDroppable"                  "1"
"ItemPermanent" "0"

"ItemCost" "5000"
"ItemStackable" "1"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemInitialCharges" "1"

"OnSpellStart"
{
"RunScript"
{
"ScriptFile" "script.lua"
"Function" "tower"
}

}
}


Вот содержимое script.lua:

Код
function tower(keys)
local pos = keys.caster:GetAbsOrigin() + (keys.caster:GetForwardVector() * 150)

  if _G.team == 1 then
        CreateUnitByName("npc_dota_tower_good", pos), true, nil, nil, DOTA_TEAM_GOODGUYS )
   else
        CreateUnitByName("npc_dota_tower_bad", pos), true, nil, nil, DOTA_TEAM_BADGUYS )
   end
     
end

Все, ничего лишнего. Можно было сделать еще более, гораздо, проще через точку каста.
Спросишь, зачем это: keys.caster:GetForwardVector() * 150 ? Потому что иначе будешь спавнить башню прям под героем.
« Последнее редактирование: 04-04-2016, 11:40:08 от Илья »

Оффлайн Илья

  • Супермодератор
  • 1892
  • Мощь: 16
Re: Создание башни
« Ответ #11 : 04-04-2016, 11:44:33 »
Если башня все равно не будет создаваться, то дело в твоем  if _G.team. Удали его и проверь, работает ли так:

Код
function tower(keys)
local caster = keys.caster
local pos = caster:GetAbsOrigin() + (caster:GetForwardVector() * 150)

  if caster:GetTeamNumber() == "#DOTA_GoodGuys" then
        CreateUnitByName("npc_dota_tower_good", pos), true, nil, nil, DOTA_TEAM_GOODGUYS )
   else
        CreateUnitByName("npc_dota_tower_bad", pos), true, nil, nil, DOTA_TEAM_BADGUYS )
   end
     
end

Если и так не работает, скидывай лог консоли с ошибкой и постарайся сам отыскать ту строчку, на которую жалуется компилятор. В крайнем случае, скидывай код с пронумерованными строчками!

Оффлайн tasman208

  • 128
  • Мощь: 0
Re: Создание башни
« Ответ #12 : 04-04-2016, 11:50:05 »
Первый вариант работает, правда скобка после pos не нужна
Код
function tower(keys)
local caster = keys.caster
local pos = keys.caster:GetAbsOrigin() + (keys.caster:GetForwardVector() * 150)
  if _G.team == 1 then
        CreateUnitByName("npc_dota_tower_good", pos, true, nil, nil, DOTA_TEAM_GOODGUYS )
   else
        CreateUnitByName("npc_dota_tower_bad", pos, true, nil, nil, DOTA_TEAM_BADGUYS )
   end 
end
Но башня все равно создается в центре
« Последнее редактирование: 04-04-2016, 11:57:00 от tasman208 »
Crusade Commanders

Оффлайн Илья

  • Супермодератор
  • 1892
  • Мощь: 16
Re: Создание башни
« Ответ #13 : 04-04-2016, 11:53:39 »
Какая еще скобка?


Скидывай свой addon_game_mod.lua

Оффлайн tasman208

  • 128
  • Мощь: 0
Re: Создание башни
« Ответ #14 : 04-04-2016, 11:59:23 »
У тебя было
Код
CreateUnitByName("npc_dota_tower_good", pos), true, nil, nil, DOTA_TEAM_GOODGUYS )

выдало ошибку. Сделал так
Код
CreateUnitByName("npc_dota_tower_good", pos, true, nil, nil, DOTA_TEAM_GOODGUYS )
Вот из главного мода
Код
function Activate()
    ListenToGameEvent("dota_player_used_ability", OnUsed, nil)
 end

function OnUsed(keys)
      local player = PlayerResource:GetPlayer(keys.PlayerID)
      local num = player:GetTeamNumber()
      local name =  GetTeamName(num)
        if name == "#DOTA_GoodGuys" then
          _G.team = 1
        else
          _G.team = 2
        end
 end
Crusade Commanders