if Spawn == nil then
_G.Spawn = class({})
end
function Spawn:InitGameMode()
ListenToGameEvent('game_rules_state_change', Dynamic_Wrap(Spawn, 'OnGameRulesStateChange'), self)
ListenToGameEvent('entity_killed', Dynamic_Wrap(Spawn, 'OnEntityKilled'), self)
end
function Spawn:OnGameRulesStateChange( keys )
local newState = GameRules:State_Get()
print("event OnGameRulesStateChange has called")
if newState == DOTA_GAMERULES_STATE_PRE_GAME then
SpawnBonusBox()
end
end
function Spawn:OnEntityKilled( keys )
local killedUnit = EntIndexToHScript( keys.entindex_killed )
local killerUnit = EntIndexToHScript( keys.entindex_attacker )
local name = killedUnit:GetUnitName()
local team = killedUnit:GetTeam()
print("event OnEntityKilled has called")
if name == "npc_motherZombie" then
DropItem(killedUnit, "item_golden_bag", 100) --заменить !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
DropItem(killedUnit, "item_bonus_str5", 50)
DropItem(killedUnit, "item_bonus_agl5", 50)
DropItem(killedUnit, "item_bonus_int5", 50)
local caster_respoint = Entities:FindByName(nil,"spawner_motherZombies"):GetAbsOrigin() --Пробиваем адрес дома
Timers:CreateTimer(50, function() --Через сколько секунд появится новый фраер(5)
local unit = CreateUnitByName(name, caster_respoint + RandomVector( RandomFloat( 0, 50)), true, nil, nil, team) --создаем нового пацыка по трем аргументам ( имя покойного ,адрес дома ,true,nil,nil,команда терпилы)
end)
elseif name == "npc_minion_zombie1" then
DropItem(killedUnit, "item_part_poison", 5)
DropItem(killedUnit, "item_bonus_str1", 3)
DropItem(killedUnit, "item_bonus_agl1", 3)
DropItem(killedUnit, "item_bonus_int1", 3)
local caster_respoint = Entities:FindByName(nil,"spawner_zombies1"):GetAbsOrigin() --Пробиваем адрес дома
Timers:CreateTimer(30, function() --Через сколько секунд появится новый фраер(5)
local unit = CreateUnitByName(name, caster_respoint + RandomVector( RandomFloat( 0, 50)), true, nil, nil, team) --создаем нового пацыка по трем аргументам ( имя покойного ,адрес дома ,true,nil,nil,команда терпилы)
end)
elseif name == "npc_minion_zombie2" then
DropItem(killedUnit, "item_part_poison", 5)
DropItem(killedUnit, "item_bonus_str1", 3)
DropItem(killedUnit, "item_bonus_agl1", 3)
DropItem(killedUnit, "item_bonus_int1", 3)
local caster_respoint = Entities:FindByName(nil,"spawner_zombies2"):GetAbsOrigin() --Пробиваем адрес дома
Timers:CreateTimer(30, function() --Через сколько секунд появится новый фраер(5)
local unit = CreateUnitByName(name, caster_respoint + RandomVector( RandomFloat( 0, 50)), true, nil, nil, team) --создаем нового пацыка по трем аргументам ( имя покойного ,адрес дома ,true,nil,nil,команда терпилы)
end)
elseif name == "npc_minion_zombie3" then
DropItem(killedUnit, "item_part_poison", 5)
DropItem(killedUnit, "item_bonus_str1", 3)
DropItem(killedUnit, "item_bonus_agl1", 3)
DropItem(killedUnit, "item_bonus_int1", 3)
local caster_respoint = Entities:FindByName(nil,"spawner_zombies3"):GetAbsOrigin() --Пробиваем адрес дома
Timers:CreateTimer(30, function() --Через сколько секунд появится новый фраер(5)
local unit = CreateUnitByName(name, caster_respoint + RandomVector( RandomFloat( 0, 50)), true, nil, nil, team) --создаем нового пацыка по трем аргументам ( имя покойного ,адрес дома ,true,nil,nil,команда терпилы)
end)
elseif name == "npc_minion_zombie4" then
DropItem(killedUnit, "item_part_poison", 5)
DropItem(killedUnit, "item_bonus_str1", 3)
DropItem(killedUnit, "item_bonus_agl1", 3)
DropItem(killedUnit, "item_bonus_int1", 3)
local caster_respoint = Entities:FindByName(nil,"spawner_zombies4"):GetAbsOrigin() --Пробиваем адрес дома
Timers:CreateTimer(30, function() --Через сколько секунд появится новый фраер(5)
local unit = CreateUnitByName(name, caster_respoint + RandomVector( RandomFloat( 0, 50)), true, nil, nil, team) --создаем нового пацыка по трем аргументам ( имя покойного ,адрес дома ,true,nil,nil,команда терпилы)
end)
end
end
function DropItem( target, item_name, chance )
local ranFloat = RandomFloat(0, 100)
if ranFloat <= chance then
local unit = target
local spawnPoint = unit:GetAbsOrigin()
local newItem = CreateItem( item_name, nil, nil )
local drop = CreateItemOnPositionForLaunch( spawnPoint, newItem )
local initialPoint = target:GetAbsOrigin() + RandomVector( RandomFloat( 50, 125 ) )
newItem:LaunchLootInitialHeight( false, 0, 150, 0.75, initialPoint )
end
end
function goldBag(keys)
local gold = keys.gold
GiveGoldPlayers( gold )
end
function GiveGoldPlayers( gold )
for index=0 ,4 do
if PlayerResource:HasSelectedHero(index) then
local player = PlayerResource:GetPlayer(index)
local hero = PlayerResource:GetSelectedHeroEntity(index)
hero:ModifyGold(gold, false, 0)
SendOverheadEventMessage( player, OVERHEAD_ALERT_GOLD, hero, gold, nil )
end
end
end
function SpawnBonusBox()
local name = "npc_seecret_box1"
local spawnPosition1 = Entities:FindByName(nil,"spawner_box1"):GetAbsOrigin()
local spawnPosition2 = Entities:FindByName(nil,"spawner_box2"):GetAbsOrigin()
local spawnPosition3 = Entities:FindByName(nil,"spawner_box3"):GetAbsOrigin()
local randInt = RandomInt(1, 6)
if randInt == 1 then
local unit = CreateUnitByName(name, spawnPosition1 + RandomVector( RandomFloat( 0, 10)), true, nil, nil, DOTA_TEAM_NEUTRALS)
local unit = CreateUnitByName(name, spawnPosition2 + RandomVector( RandomFloat( 0, 10)), true, nil, nil, DOTA_TEAM_NEUTRALS)
elseif randInt == 2 then
local unit = CreateUnitByName(name, spawnPosition2 + RandomVector( RandomFloat( 0, 10)), true, nil, nil, DOTA_TEAM_NEUTRALS)
local unit = CreateUnitByName(name, spawnPosition3 + RandomVector( RandomFloat( 0, 10)), true, nil, nil, DOTA_TEAM_NEUTRALS)
elseif randInt == 3 then
local unit = CreateUnitByName(name, spawnPosition1 + RandomVector( RandomFloat( 0, 10)), true, nil, nil, DOTA_TEAM_NEUTRALS)
local unit = CreateUnitByName(name, spawnPosition3 + RandomVector( RandomFloat( 0, 10)), true, nil, nil, DOTA_TEAM_NEUTRALS)
elseif randInt == 4 then
local unit = CreateUnitByName(name, spawnPosition1 + RandomVector( RandomFloat( 0, 10)), true, nil, nil, DOTA_TEAM_NEUTRALS)
elseif randInt == 5 then
local unit = CreateUnitByName(name, spawnPosition2 + RandomVector( RandomFloat( 0, 10)), true, nil, nil, DOTA_TEAM_NEUTRALS)
elseif randInt == 6 then
local unit = CreateUnitByName(name, spawnPosition3 + RandomVector( RandomFloat( 0, 10)), true, nil, nil, DOTA_TEAM_NEUTRALS)
end
end
Spawn:InitGameMode()
это можно сократить раз в 15 минимумПомогите, пожалуйста. Функция OnEntityKilled слушателя при вызове срабатывает 2 раза
Lua:if Spawn == nil then _G.Spawn = class({}) end function Spawn:InitGameMode() ListenToGameEvent('game_rules_state_change', Dynamic_Wrap(Spawn, 'OnGameRulesStateChange'), self) ListenToGameEvent('entity_killed', Dynamic_Wrap(Spawn, 'OnEntityKilled'), self) end function Spawn:OnGameRulesStateChange( keys ) local newState = GameRules:State_Get() print("event OnGameRulesStateChange has called") if newState == DOTA_GAMERULES_STATE_PRE_GAME then SpawnBonusBox() end end function Spawn:OnEntityKilled( keys ) local killedUnit = EntIndexToHScript( keys.entindex_killed ) local killerUnit = EntIndexToHScript( keys.entindex_attacker ) local name = killedUnit:GetUnitName() local team = killedUnit:GetTeam() print("event OnEntityKilled has called") if name == "npc_motherZombie" then DropItem(killedUnit, "item_golden_bag", 100) --заменить !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! DropItem(killedUnit, "item_bonus_str5", 50) DropItem(killedUnit, "item_bonus_agl5", 50) DropItem(killedUnit, "item_bonus_int5", 50) local caster_respoint = Entities:FindByName(nil,"spawner_motherZombies"):GetAbsOrigin() --Пробиваем адрес дома Timers:CreateTimer(50, function() --Через сколько секунд появится новый фраер(5) local unit = CreateUnitByName(name, caster_respoint + RandomVector( RandomFloat( 0, 50)), true, nil, nil, team) --создаем нового пацыка по трем аргументам ( имя покойного ,адрес дома ,true,nil,nil,команда терпилы) end) elseif name == "npc_minion_zombie1" then DropItem(killedUnit, "item_part_poison", 5) DropItem(killedUnit, "item_bonus_str1", 3) DropItem(killedUnit, "item_bonus_agl1", 3) DropItem(killedUnit, "item_bonus_int1", 3) local caster_respoint = Entities:FindByName(nil,"spawner_zombies1"):GetAbsOrigin() --Пробиваем адрес дома Timers:CreateTimer(30, function() --Через сколько секунд появится новый фраер(5) local unit = CreateUnitByName(name, caster_respoint + RandomVector( RandomFloat( 0, 50)), true, nil, nil, team) --создаем нового пацыка по трем аргументам ( имя покойного ,адрес дома ,true,nil,nil,команда терпилы) end) elseif name == "npc_minion_zombie2" then DropItem(killedUnit, "item_part_poison", 5) DropItem(killedUnit, "item_bonus_str1", 3) DropItem(killedUnit, "item_bonus_agl1", 3) DropItem(killedUnit, "item_bonus_int1", 3) local caster_respoint = Entities:FindByName(nil,"spawner_zombies2"):GetAbsOrigin() --Пробиваем адрес дома Timers:CreateTimer(30, function() --Через сколько секунд появится новый фраер(5) local unit = CreateUnitByName(name, caster_respoint + RandomVector( RandomFloat( 0, 50)), true, nil, nil, team) --создаем нового пацыка по трем аргументам ( имя покойного ,адрес дома ,true,nil,nil,команда терпилы) end) elseif name == "npc_minion_zombie3" then DropItem(killedUnit, "item_part_poison", 5) DropItem(killedUnit, "item_bonus_str1", 3) DropItem(killedUnit, "item_bonus_agl1", 3) DropItem(killedUnit, "item_bonus_int1", 3) local caster_respoint = Entities:FindByName(nil,"spawner_zombies3"):GetAbsOrigin() --Пробиваем адрес дома Timers:CreateTimer(30, function() --Через сколько секунд появится новый фраер(5) local unit = CreateUnitByName(name, caster_respoint + RandomVector( RandomFloat( 0, 50)), true, nil, nil, team) --создаем нового пацыка по трем аргументам ( имя покойного ,адрес дома ,true,nil,nil,команда терпилы) end) elseif name == "npc_minion_zombie4" then DropItem(killedUnit, "item_part_poison", 5) DropItem(killedUnit, "item_bonus_str1", 3) DropItem(killedUnit, "item_bonus_agl1", 3) DropItem(killedUnit, "item_bonus_int1", 3) local caster_respoint = Entities:FindByName(nil,"spawner_zombies4"):GetAbsOrigin() --Пробиваем адрес дома Timers:CreateTimer(30, function() --Через сколько секунд появится новый фраер(5) local unit = CreateUnitByName(name, caster_respoint + RandomVector( RandomFloat( 0, 50)), true, nil, nil, team) --создаем нового пацыка по трем аргументам ( имя покойного ,адрес дома ,true,nil,nil,команда терпилы) end) end end function DropItem( target, item_name, chance ) local ranFloat = RandomFloat(0, 100) if ranFloat <= chance then local unit = target local spawnPoint = unit:GetAbsOrigin() local newItem = CreateItem( item_name, nil, nil ) local drop = CreateItemOnPositionForLaunch( spawnPoint, newItem ) local initialPoint = target:GetAbsOrigin() + RandomVector( RandomFloat( 50, 125 ) ) newItem:LaunchLootInitialHeight( false, 0, 150, 0.75, initialPoint ) end end function goldBag(keys) local gold = keys.gold GiveGoldPlayers( gold ) end function GiveGoldPlayers( gold ) for index=0 ,4 do if PlayerResource:HasSelectedHero(index) then local player = PlayerResource:GetPlayer(index) local hero = PlayerResource:GetSelectedHeroEntity(index) hero:ModifyGold(gold, false, 0) SendOverheadEventMessage( player, OVERHEAD_ALERT_GOLD, hero, gold, nil ) end end end function SpawnBonusBox() local name = "npc_seecret_box1" local spawnPosition1 = Entities:FindByName(nil,"spawner_box1"):GetAbsOrigin() local spawnPosition2 = Entities:FindByName(nil,"spawner_box2"):GetAbsOrigin() local spawnPosition3 = Entities:FindByName(nil,"spawner_box3"):GetAbsOrigin() local randInt = RandomInt(1, 6) if randInt == 1 then local unit = CreateUnitByName(name, spawnPosition1 + RandomVector( RandomFloat( 0, 10)), true, nil, nil, DOTA_TEAM_NEUTRALS) local unit = CreateUnitByName(name, spawnPosition2 + RandomVector( RandomFloat( 0, 10)), true, nil, nil, DOTA_TEAM_NEUTRALS) elseif randInt == 2 then local unit = CreateUnitByName(name, spawnPosition2 + RandomVector( RandomFloat( 0, 10)), true, nil, nil, DOTA_TEAM_NEUTRALS) local unit = CreateUnitByName(name, spawnPosition3 + RandomVector( RandomFloat( 0, 10)), true, nil, nil, DOTA_TEAM_NEUTRALS) elseif randInt == 3 then local unit = CreateUnitByName(name, spawnPosition1 + RandomVector( RandomFloat( 0, 10)), true, nil, nil, DOTA_TEAM_NEUTRALS) local unit = CreateUnitByName(name, spawnPosition3 + RandomVector( RandomFloat( 0, 10)), true, nil, nil, DOTA_TEAM_NEUTRALS) elseif randInt == 4 then local unit = CreateUnitByName(name, spawnPosition1 + RandomVector( RandomFloat( 0, 10)), true, nil, nil, DOTA_TEAM_NEUTRALS) elseif randInt == 5 then local unit = CreateUnitByName(name, spawnPosition2 + RandomVector( RandomFloat( 0, 10)), true, nil, nil, DOTA_TEAM_NEUTRALS) elseif randInt == 6 then local unit = CreateUnitByName(name, spawnPosition3 + RandomVector( RandomFloat( 0, 10)), true, nil, nil, DOTA_TEAM_NEUTRALS) end end Spawn:InitGameMode()
после 30 уровна перестают даватся скилл поинты, выдвавай вручную в ивенте апа уровняЗашел в свою кастомку спустя пол года перестала корректно работать лвл система дается всего 19 скилл поинтов за 99 уровней.Кто знает что валвы натворили?
скорее всего это из за предмета(возможно)Всем доброго времени суток! Решил попробовать себя в создании простой кастомной игры и встретился с проблемой barebones. Когда поставил barebones вокруг персонажа появился синий круг, искал ответы на форуме не нашел, подскажите как его убрать.Посмотреть вложение 1016
Очень похоже на индикатор вижена, при наведении на портрет героя с зажатым ALT...Всем доброго времени суток! Решил попробовать себя в создании простой кастомной игры и встретился с проблемой barebones. Когда поставил barebones вокруг персонажа появился синий круг, искал ответы на форуме не нашел, подскажите как его убрать.Посмотреть вложение 1016
У меня такое было, если выключить, а затем опять включить туман войны.Всем доброго времени суток! Решил попробовать себя в создании простой кастомной игры и встретился с проблемой barebones. Когда поставил barebones вокруг персонажа появился синий круг, искал ответы на форуме не нашел, подскажите как его убрать.Посмотреть вложение 1016
function zzz:OnProjectileHit(hTarget, vLocation)
if hTarget ~= nil then
local damage = {
victim = hTarget,
attacker = self.caster,
damage = (self.dmg + self.int_multiplier)*Тута множитель,
damage_type = DAMAGE_TYPE_MAGICAL,
ability=self
}
ApplyDamage( damage )
end
end
А цифра есть для умножение? Или это в скобках, умножитель который, только вместо звезды, плюсик. ?Вопросик если скилл выпускает несколько снарядов то как мне можно сделать множитель урона для каждого выпущенного? как то по инстансам разделить?
Код:function zzz:OnProjectileHit(hTarget, vLocation) if hTarget ~= nil then local damage = { victim = hTarget, attacker = self.caster, damage = (self.dmg + self.int_multiplier)*Тута множитель(что здесь не ужели нету цифры чтобы умножить?), damage_type = DAMAGE_TYPE_MAGICAL, ability=self } ApplyDamage( damage ) end end
Не знаю, как, но можно сделать как у ангел арены что скиллы и другие недоступныеСтолкнулся с проблемой ,что есть челы которые воруют кастомку с каждой твоей обновой и выкладывают как свою. Еще сверху плюшки добавляют от себя дизбалансные, что привлекает себе внимание новичков которые сразу же хотят миллион золото и тд. Как можно закодировать или ограничить кастомку от других лиц
Эта цифра что то вроди множителя урона , скил наносит 100% урона (dmg=Totaldmg*1)А цифра есть для умножение? Или это в скобках, умножитель который, только вместо звезды, плюсик. ?
Столкнулся с проблемой ,что есть челы которые воруют кастомку с каждой твоей обновой и выкладывают как свою. Еще сверху плюшки добавляют от себя дизбалансные, что привлекает себе внимание новичков которые сразу же хотят миллион золото и тд. Как можно закодировать или ограничить кастомку от других лиц
Не знаю, как, но можно сделать как у ангел арены что скиллы и другие недоступные
Ясно пустая ссылка
Вопросик если скилл выпускает несколько снарядов то как мне можно сделать множитель урона для каждого выпущенного? как то по инстансам разделить?
Код:function zzz:OnProjectileHit(hTarget, vLocation) if hTarget ~= nil then local damage = { victim = hTarget, attacker = self.caster, damage = (self.dmg + self.int_multiplier)*Тута множитель, damage_type = DAMAGE_TYPE_MAGICAL, ability=self } ApplyDamage( damage ) end end
function zzz:OnProjectileHit(hTarget, vLocation)
if hTarget ~= nil then
local total_damage = self.dmg + self.int_multiplier
local hit_multiplier = 0.5
local damage_table = {
victim = hTarget,
attacker = self.caster,
damage_type = DAMAGE_TYPE_MAGICAL,
ability=self
}
if hTarget.hit_damage and hTarget.hit_damage > 0 then
total_damage = hTarget.hit_damage * hit_multiplier
hTarget.hit_damage = total_damage
else
hTarget.hit_damage = total_damage
end
damage_table.damage = total_damage,
ApplyDamage( damage_table )
end
end
Вопросик если скилл выпускает несколько снарядов то как мне можно сделать множитель урона для каждого выпущенного? как то по инстансам разделить?
Код:function zzz:OnProjectileHit(hTarget, vLocation) if hTarget ~= nil then local damage = { victim = hTarget, attacker = self.caster, damage = (self.dmg + self.int_multiplier)*Тута множитель, damage_type = DAMAGE_TYPE_MAGICAL, ability=self } ApplyDamage( damage ) end end
Этот метод возвращает ключ уникальный для кастомки и с ним вы можете обезопасить свои данные, например не писать скилл в файлах доты, а сделать свой сервер на который вы отсылаете запрос, в запросе помимо сопутствующей инфы вы передаёте этот ключ, если ключ от вашей кастомки то вы выполняете действие, иначе - не выполняете. Простой пример. У вас есть код скилла на луа. Вы его достаёте из кастомки и посещаете в бд сервера, при запуске кастомки отправляете запрос на получение этого скилла не забыв добавить ключ вашей кастомки. На сервере при получении запроса вы сначала проверяете ключ и если он совпадает с тем который принадлежит вашей кастомку, то достаёте код из бд и возвращает его в теле ответа. Если ключ не совпадает возвращаете ошибку.Ясно пустая ссылка
Как тогда у ангел арене?
Как то не понятно.Этот метод возвращает ключ уникальный для кастомки и с ним вы можете обезопасить свои данные, например не писать скилл в файлах доты, а сделать свой сервер на который вы отсылаете запрос, в запросе помимо сопутствующей инфы вы передаёте этот ключ, если ключ от вашей кастомки то вы выполняете действие, иначе - не выполняете. Простой пример. У вас есть код скилла на луа. Вы его достаёте из кастомки и посещаете в бд сервера, при запуске кастомки отправляете запрос на получение этого скилла не забыв добавить ключ вашей кастомки. На сервере при получении запроса вы сначала проверяете ключ и если он совпадает с тем который принадлежит вашей кастомку, то достаёте код из бд и возвращает его в теле ответа. Если ключ не совпадает возвращаете ошибку.
При получении ответа на клиенте(в данном случае клиентом является сервер доты) вы выполняете этот скрипт через loadstring