User:ArthurAutomaton/sandbox
Jump to navigation
Jump to search
Warning:The two triggers should not overlap physically! (My triggers are setup like this.)
Sandbox
Some notes to myself about modding DotA 2.
Creating a unit that's controllable by a specific player
This code creates a mud golem at (0, 0, 0) on the Radiant team and makes it controllable by player 0:
unit_team = DOTA_TEAM_GOODGUYS unit_name = "npc_dota_neutral_mud_golem" player = PlayerResource:GetPlayer(0) point = Vector(0, 0, 0) unit = CreateUnitByName(unit_name, point, true, nil, nil, unit_team) unit:SetControllableByPlayer(player:GetPlayerID(), true)
Relevant links:
CDOTA_BaseNPC_Hero.SetGold
void SetGold(int amount, bool reliable)
Sets the gold amount for the player owning this hero
Parameters
| Type | Name | Description |
|---|---|---|
| int | amount | An amount of gold |
| bool | reliable | If true, the player's reliable gold will be set to amount; if false, the player's unreliable gold will be set to amount.
|
Jail System
Hammer Setup
In Hammer, create a trigger_hero with the name radiant_prison. Create another trigger_hero with the name dire_prison.
Set the Entity Scripts property of both triggers to jail_trigger.lua. Finally, add an output on both triggers as follows:
VScripts
jail_trigger.lua:
function ReleasePrisonersConditionally(trigger)
print("!!! ReleasePrisonersConditionally CALLED !!!")
local jailSystem = GameRules.MyAddon.jailSystem
local thisPrison = trigger.caller
local vInmates = jailSystem:GetPrisoners(thisPrison)
if #vInmates == 0 then
print("no inmates found in " .. thisPrison:GetName())
return
end
local nTeamID = vInmates[1]:GetTeam()
if (not jailSystem:IsImprisoned(trigger.activator, thisPrison) and
trigger.activator:GetTeam() == nTeamID) then
print("releasing prisoners")
for _,npc in pairs(vInmates) do
jailSystem:Release(npc, thisPrison)
end
end
end
addon_game_mode.lua:
RAZOR = "npc_dota_hero_razor"
RADIANT_PRISON = "radiant_prison"
DIRE_PRISON = "dire_prison"
if CMyGameMode == nil then
CMyGameMode = class({})
end
function Precache (context)
PrecacheUnitByNameSync(RAZOR, context) -- XXX
end
-- Create the game mode when we activate
function Activate ()
GameRules.MyAddon = CMyGameMode()
GameRules.MyAddon:InitGameMode()
end
function CMyGameMode:InitGameMode ()
print( "Addon is loaded." )
GameRules:SetHeroRespawnEnabled(false)
-- XXX: For testing; remember to remove this!
self:PopulateWorldForTesting()
-- Initialize the jail system
self.jailSystem = CJailSystem({
[DOTA_TEAM_GOODGUYS] = Entities:FindByName(nil, DIRE_PRISON),
[DOTA_TEAM_BADGUYS] = Entities:FindByName(nil, RADIANT_PRISON)
})
self.jailSystem:Init()
end
function CMyGameMode:PopulateWorldForTesting ()
local razor = CreateUnitByName(RAZOR, Vector(0, 512, 0), true,
nil, nil, DOTA_TEAM_BADGUYS)
razor:SetControllableByPlayer(0, true)
end
----------
if CJailSystem == nil then
CJailSystem = class({ team2prison = {};
prisoners = {};
constructor = function (self, tbl)
self.team2prison = tbl or self.team2prison
for _,v in pairs(self.team2prison) do
v.JAIL_prisoners = {} -- XXX: Use DoUniqueString
end
end
})
end
function CJailSystem:Init ()
ListenToGameEvent("entity_killed", Dynamic_Wrap(CJailSystem, "OnEntityKilled" ), self)
end
function CJailSystem:GetPrisoners (prison)
local vInmates = {}
for k,_ in pairs(prison.JAIL_prisoners) do
table.insert(vInmates, k)
end
return vInmates
end
function CJailSystem:IsImprisoned (npc, prison)
return prison.JAIL_prisoners[npc]
end
function CJailSystem:OnEntityKilled (keys)
local killedEntity = EntIndexToHScript(keys.entindex_killed)
local prison = self.team2prison[killedEntity:GetTeam()]
if killedEntity:UnitCanRespawn() and prison then
self:Imprison(killedEntity, prison)
end
end
function CJailSystem:Imprison (npc, prison)
prison.JAIL_prisoners[npc] = true
npc:RespawnUnit()
FindClearSpaceForUnit(npc, prison:GetCenter(), false)
-- XXX: If we apply modifiers now, nothing happens (API bug?);
-- so we wait a bit and then apply them.
GameRules:GetGameModeEntity():SetThink(
function()
npc:AddNewModifier(npc, nil, "modifier_stunned", nil)
npc:AddNewModifier(npc, nil, "modifier_invulnerable", nil)
end, nil, 0.5)
end
function CJailSystem:Release (npc, prison)
prison.JAIL_prisoners[npc] = false
npc:RemoveModifierByName("modifier_stunned")
npc:RemoveModifierByName("modifier_invulnerable")
-- Add teleport stuff here!
end