From 910febfde7d55b0274163d08f628fa78a3609517 Mon Sep 17 00:00:00 2001 From: lcdr Date: Sun, 27 Aug 2017 20:33:00 +0200 Subject: [PATCH] v2017.08.27 - implemented spawn on smash --- luserver/components/rebuild.py | 2 +- luserver/components/spawner.py | 20 +++++++++++++++---- luserver/components/stats.py | 3 +-- .../property/small/world_control.py | 1 + .../scripts/gnarled_forest/banana_tree.py | 2 +- runtime/db/luz_importer.py | 3 ++- 6 files changed, 22 insertions(+), 9 deletions(-) diff --git a/luserver/components/rebuild.py b/luserver/components/rebuild.py index 8882a1b..a39749c 100644 --- a/luserver/components/rebuild.py +++ b/luserver/components/rebuild.py @@ -112,7 +112,7 @@ class RebuildComponent(ScriptedActivityComponent): def drain_imagination(self, player): if player.stats.imagination == 0: - self.rebuild_cancel(early_release=False, user_id=player.object_id) + self.rebuild_cancel(early_release=False, user=player) player.stats.imagination -= 1 def complete_rebuild(self, player): diff --git a/luserver/components/spawner.py b/luserver/components/spawner.py index 95373b3..34940e0 100644 --- a/luserver/components/spawner.py +++ b/luserver/components/spawner.py @@ -12,7 +12,7 @@ class SpawnerComponent(Component): self.name = set_vars.get("spawner_name") self.unknown = set_vars.get("spawner_unknown", (0, 0, 1)) self.waypoints = set_vars["spawner_waypoints"] - self.spawned_on_smash = set_vars.get("spawned_on_smash", False) + self.spawn_net_on_smash = set_vars.get("spawn_net_on_smash") self.last_waypoint_index = 0 def serialize(self, out, is_creation): @@ -21,13 +21,14 @@ class SpawnerComponent(Component): def on_startup(self): if self.name is not None: server.spawners[self.name] = self.object - if self.active:# and not self.spawned_on_smash: + if self.active: + if self.spawn_net_on_smash is not None: + server.spawners[self.spawn_net_on_smash].add_handler("on_spawned_destruction", self.spawn_on_smash) + return for _ in range(min(self.unknown[2], len(self.waypoints))): self.spawn() def spawn(self): - if not self.active: - return spawned_vars = self.waypoints[self.last_waypoint_index].copy() spawned_vars["spawner"] = self.object spawned = server.spawn_object(self.spawntemplate, spawned_vars) @@ -45,3 +46,14 @@ class SpawnerComponent(Component): for obj in server.game_objects.copy().values(): if obj.spawner_object == self.object: server.replica_manager.destruct(obj) + + def on_spawned_destruction(self): + if self.active: + self.object.call_later(8, self.spawn) + if self.spawn_net_on_smash: + self.active = True + + def spawn_on_smash(self, spawner): + if self.active: + self.spawn() + self.active = False diff --git a/luserver/components/stats.py b/luserver/components/stats.py index 819c1cf..ee05de7 100644 --- a/luserver/components/stats.py +++ b/luserver/components/stats.py @@ -1,4 +1,3 @@ -import asyncio import logging from ..bitstream import c_bit, c_float, c_int, c_int64, c_uint @@ -138,7 +137,7 @@ class StatsSubcomponent(Component): def on_destruction(self): if self.object.spawner_object is not None: - asyncio.get_event_loop().call_later(8, self.object.spawner_object.spawner.spawn) + self.object.spawner_object.handle("on_spawned_destruction") @broadcast def die(self, client_death:bool=False, spawn_loot:bool=True, death_type:str=None, direction_relative_angle_xz:float=None, direction_relative_angle_y:float=None, direction_relative_force:float=None, kill_type:c_uint=0, killer:GameObject=None, loot_owner:GameObject=0): diff --git a/luserver/scripts/avant_gardens/property/small/world_control.py b/luserver/scripts/avant_gardens/property/small/world_control.py index e912fad..681012d 100644 --- a/luserver/scripts/avant_gardens/property/small/world_control.py +++ b/luserver/scripts/avant_gardens/property/small/world_control.py @@ -5,6 +5,7 @@ from luserver.ldf import LDFDataType from luserver.messages import single from luserver.world import server from luserver.components.mission import MissionState, TaskType + FLAG_DEFEATED_SPIDER = 71 class ScriptComponent(script.ScriptComponent): diff --git a/luserver/scripts/gnarled_forest/banana_tree.py b/luserver/scripts/gnarled_forest/banana_tree.py index 2064d22..5b9b376 100644 --- a/luserver/scripts/gnarled_forest/banana_tree.py +++ b/luserver/scripts/gnarled_forest/banana_tree.py @@ -10,7 +10,7 @@ class ScriptComponent(script.ScriptComponent): def spawn_banana(self): if self.banana is None: self.banana = server.spawn_object(6909, {"position": self.banana_pos(), "rotation": self.object.physics.rotation}) - self.banana.add_handler("on_destrucition", self.on_banana_death) + self.banana.add_handler("on_destruction", self.on_banana_death) def on_hit(self, damage, attacker): self.object.stats.life = self.object.stats.max_life # indestructible diff --git a/runtime/db/luz_importer.py b/runtime/db/luz_importer.py index 7c2fa9f..0f5ab25 100644 --- a/runtime/db/luz_importer.py +++ b/runtime/db/luz_importer.py @@ -398,7 +398,8 @@ class _LVLImporter: spawner_vars["spawntemplate"] = config["spawntemplate"] if "spawnsGroupOnSmash" in config: if config["spawnsGroupOnSmash"]: - spawner_vars["spawned_on_smash"] = True + assert "spawnNetNameForSpawnGroupOnSmash" in config + spawner_vars["spawn_net_on_smash"] = config["spawnNetNameForSpawnGroupOnSmash"] spawner_vars["spawner_waypoints"] = spawned_vars, spawned_vars = spawner_vars