::Think_CustomRocket <- function() { if(NetProps.GetPropInt(self, "m_lifeState") != 0) { NetProps.SetPropString(self, "m_iszScriptThinkFunction", "") } for (local ent; ent = Entities.FindByClassname(ent, "tf_projectile_rocket");) { if (ent.GetOwner() != self) continue Callbacks.SetDestroyCallback(ent, function() { DispatchParticleEffect("hightower_explosion", self.GetCenter(), Vector()) }) ent.KeyValueFromString("classname", "megaton") } return -1 } ::Callbacks <- { function SetDestroyCallback(entity, callback) { entity.ValidateScriptScope(); local scope = entity.GetScriptScope(); scope.setdelegate({}.setdelegate({ parent = scope.getdelegate() id = entity.GetScriptId() index = entity.entindex() callback = callback _get = function(k) { return parent[k]; } _delslot = function(k) { if (k == id) { entity = EntIndexToHScript(index); local scope = entity.GetScriptScope(); scope.self <- entity; callback.pcall(scope); } delete parent[k]; } }) ); } function OnGameEvent_player_spawn(params) { local hEntity = GetPlayerFromUserID(params.userid) if (!hEntity || !hEntity.IsValid()) return EntFireByHandle(hEntity, "RunScriptCode", @" if (self.IsBotOfType(1337) && self.HasBotTag(`bot_custom_explode_particle`)) AddThinkToEnt(self, `Think_CustomRocket`) ", -1, null, null) } } __CollectGameEventCallbacks(::Callbacks)