v2017.10.29

- more skill logging
- fixed a conflict error
- implemented "collect powerup" mission task type
- fixed objects not spawning on block yard
This commit is contained in:
lcdr
2017-10-29 20:21:40 +01:00
parent 4474214801
commit 54a7393614
9 changed files with 54 additions and 32 deletions

View File

@@ -1,6 +1,7 @@
# luserver # luserver
## A LEGO Universe server ## A LEGO Universe server
### Created by lcdr ### Created by lcdr
### Source repository at https://bitbucket.org/lcdr/luserver/
### License: GPL v3 ### License: GPL v3
### Installation ### Installation

View File

@@ -58,6 +58,7 @@ class AuthServer(server.Server):
password = request.read(str, allocated_length=41) password = request.read(str, allocated_length=41)
if username not in self.db.accounts: if username not in self.db.accounts:
log.info("Login attempt with username %s and invalid password", username)
raise LoginError(LoginReturnCode.InvalidUsernameOrPassword) raise LoginError(LoginReturnCode.InvalidUsernameOrPassword)
account = self.db.accounts[username] account = self.db.accounts[username]

View File

@@ -96,7 +96,9 @@ class TacArc(Behavior):
else: else:
if hasattr(behavior, "blocked_action"): if hasattr(behavior, "blocked_action"):
if bitstream.read(c_bit): # is blocked is_blocked = bitstream.read(c_bit)
log.debug("blocked bit %s", is_blocked)
if is_blocked:
log.debug("blocked") log.debug("blocked")
self.deserialize_behavior(behavior.blocked_action, bitstream, target, level+1) self.deserialize_behavior(behavior.blocked_action, bitstream, target, level+1)
return return
@@ -377,6 +379,7 @@ class Chain(Behavior):
@staticmethod @staticmethod
def deserialize(self, behavior, bitstream, target, level): def deserialize(self, behavior, bitstream, target, level):
chain_index = bitstream.read(c_uint) chain_index = bitstream.read(c_uint)
log.debug("chain index %i", chain_index)
self.deserialize_behavior(behavior.behaviors[chain_index-1], bitstream, target, level+1) self.deserialize_behavior(behavior.behaviors[chain_index-1], bitstream, target, level+1)
class ForceMovement(Behavior): class ForceMovement(Behavior):

View File

@@ -450,6 +450,7 @@ class CharacterComponent(Component, CharActivity, CharCamera, CharMission, CharP
if lot in (177, 935, 4035, 6431, 7230, 8200, 8208, 11910, 11911, 11912, 11913, 11914, 11915, 11916, 11917, 11918, 11919, 11920): # powerup if lot in (177, 935, 4035, 6431, 7230, 8200, 8208, 11910, 11911, 11912, 11913, 11914, 11915, 11916, 11917, 11918, 11919, 11920): # powerup
for skill_id, _ in server.db.object_skills[lot]: for skill_id, _ in server.db.object_skills[lot]:
self.object.skill.cast_skill(skill_id) self.object.skill.cast_skill(skill_id)
self.update_mission_task(TaskType.CollectPowerup, skill_id)
else: else:
self.object.inventory.add_item_to_inventory(lot) self.object.inventory.add_item_to_inventory(lot)
del self.dropped_loot[loot_object_id] del self.dropped_loot[loot_object_id]

View File

@@ -13,6 +13,7 @@ class TaskType:
MinigameAchievement = 14 MinigameAchievement = 14
Interact = 15 Interact = 15
MissionComplete = 16 MissionComplete = 16
CollectPowerup = 21
TamePet = 22 TamePet = 22
# CompleteRace = 23 ? or CompleteActivity or something? # CompleteRace = 23 ? or CompleteActivity or something?
Flag = 24 Flag = 24

View File

@@ -5,7 +5,7 @@ class SpawnerComponent(Component):
def __init__(self, obj, set_vars, comp_id): def __init__(self, obj, set_vars, comp_id):
super().__init__(obj, set_vars, comp_id) super().__init__(obj, set_vars, comp_id)
self.object.spawner = self self.object.spawner = self
self.active = set_vars.get("active_on_load", True) self._active = set_vars.get("active_on_load", True)
self.spawntemplate = set_vars["spawntemplate"] self.spawntemplate = set_vars["spawntemplate"]
self.name = set_vars.get("spawner_name") self.name = set_vars.get("spawner_name")
self.respawn_time = set_vars.get("respawn_time", 8) self.respawn_time = set_vars.get("respawn_time", 8)
@@ -15,6 +15,7 @@ class SpawnerComponent(Component):
self.waypoints = set_vars["spawner_waypoints"] self.waypoints = set_vars["spawner_waypoints"]
self.spawn_net_on_smash = set_vars.get("spawn_net_on_smash") self.spawn_net_on_smash = set_vars.get("spawn_net_on_smash")
self.last_waypoint_index = 0 self.last_waypoint_index = 0
self.num_spawned = 0
def serialize(self, out, is_creation): def serialize(self, out, is_creation):
pass pass
@@ -22,14 +23,20 @@ class SpawnerComponent(Component):
def on_startup(self): def on_startup(self):
if self.name is not None: if self.name is not None:
server.spawners[self.name] = self.object server.spawners[self.name] = self.object
if self.active: if self._active:
if self.spawn_net_on_smash is not None: 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) server.spawners[self.spawn_net_on_smash].add_handler("on_spawned_destruction", self.spawn_on_smash)
return return
self.spawn_all()
def spawn_all(self):
for _ in range(min(self.num_to_maintain, len(self.waypoints))): for _ in range(min(self.num_to_maintain, len(self.waypoints))):
self.spawn() self.spawn()
def spawn(self): def spawn(self):
if not self._active or self.num_spawned >= self.num_to_maintain:
return
spawned_vars = self.waypoints[self.last_waypoint_index].copy() spawned_vars = self.waypoints[self.last_waypoint_index].copy()
spawned_vars["spawner"] = self.object spawned_vars["spawner"] = self.object
spawned = server.spawn_object(self.spawntemplate, spawned_vars) spawned = server.spawn_object(self.spawntemplate, spawned_vars)
@@ -37,10 +44,15 @@ class SpawnerComponent(Component):
self.last_waypoint_index = 0 self.last_waypoint_index = 0
else: else:
self.last_waypoint_index += 1 self.last_waypoint_index += 1
self.num_spawned += 1
return spawned return spawned
def activate(self):
self._active = True
self.spawn_all()
def deactivate(self): def deactivate(self):
self.active = False self._active = False
def destroy(self): def destroy(self):
self.deactivate() self.deactivate()
@@ -49,12 +61,13 @@ class SpawnerComponent(Component):
server.replica_manager.destruct(obj) server.replica_manager.destruct(obj)
def on_spawned_destruction(self): def on_spawned_destruction(self):
if self.active: self.num_spawned -= 1
if self._active:
self.object.call_later(self.respawn_time, self.spawn) self.object.call_later(self.respawn_time, self.spawn)
if self.spawn_net_on_smash: if self.spawn_net_on_smash:
self.active = True self._active = True
def spawn_on_smash(self, spawner): def spawn_on_smash(self, spawner):
if self.active: if self._active:
self.spawn() self.spawn()
self.active = False self._active = False

View File

@@ -14,11 +14,24 @@ class ScriptComponent(script.ScriptComponent):
@single @single
def player_ready(self, player): def player_ready(self, player):
if player.char.get_flag(FLAG_DEFEATED_SPIDER): if not player.char.get_flag(FLAG_DEFEATED_SPIDER):
self.clear_maelstrom(player) self.start_maelstrom()
return else:
server.spawners["FXObject"].spawner.destroy()
for spawner in ("BirdFX", "SunBeam", "Instancer"): # todo: implement distinction between instance and claim property (different launcher)
server.spawners["Launcher"].spawner.activate()
if 320 not in player.char.missions:
server.spawners["PropertyGuard"].spawner.activate()
def start_maelstrom(self):
for spawner in ("SpiderBoss", "SpiderEggs"):
server.spawners[spawner].spawner.activate()
server.spawners["Rocks"].spawner.activate()
for spawner in ("BirdFX", "SunBeam"):
server.spawners[spawner].spawner.destroy() server.spawners[spawner].spawner.destroy()
self.set_network_var("unclaimed", LDFDataType.BOOLEAN, True) self.set_network_var("unclaimed", LDFDataType.BOOLEAN, True)
@@ -30,22 +43,11 @@ class ScriptComponent(script.ScriptComponent):
self.notify_client_object(name="maelstromSkyOn", param1=0, param2=0, param_str=b"", param_obj=None) self.notify_client_object(name="maelstromSkyOn", param1=0, param2=0, param_str=b"", param_obj=None)
def clear_maelstrom(self, player):
for spawner in ("AggroVol", "FXObject", "Instancer", "Land_Target", "Rocks", "RFS_Targets", "SpiderBoss", "SpiderEggs", "SpiderRocket_Bot", "SpiderRocket_Mid", "SpiderRocket_Top", "TeleVol"):
server.spawners[spawner].spawner.destroy()
for i in range(5):
server.spawners["ROF_Targets_0"+str(i)].spawner.destroy()
for i in range(1, 9):
server.spawners["Zone"+str(i)+"Vol"].spawner.destroy()
if 320 in player.char.missions:
server.spawners["PropertyGuard"].spawner.destroy()
def on_spider_defeated(self): def on_spider_defeated(self):
player = [obj for obj in server.game_objects.values() if obj.lot == 1][0] player = [obj for obj in server.game_objects.values() if obj.lot == 1][0]
if player.char.get_flag(FLAG_DEFEATED_SPIDER): if player.char.get_flag(FLAG_DEFEATED_SPIDER):
return return
server.spawners["SpiderBoss"].spawner.destroy() server.spawners["SpiderBoss"].spawner.deactivate()
for spawner in ("AggroVol", "Instancer", "Land_Target", "Rocks", "RFS_Targets", "SpiderEggs", "SpiderRocket_Bot", "SpiderRocket_Mid", "SpiderRocket_Top", "TeleVol"): for spawner in ("AggroVol", "Instancer", "Land_Target", "Rocks", "RFS_Targets", "SpiderEggs", "SpiderRocket_Bot", "SpiderRocket_Mid", "SpiderRocket_Top", "TeleVol"):
server.spawners[spawner].spawner.destroy() server.spawners[spawner].spawner.destroy()
for i in range(5): for i in range(5):

View File

@@ -120,7 +120,7 @@ class WorldServer(Server):
self.instance_id = self.db.current_instance_id self.instance_id = self.db.current_instance_id
self.db.current_instance_id += 1 self.db.current_instance_id += 1
self.conn.transaction_manager.commit() self.commit()
self.current_object_id = 0 self.current_object_id = 0
self.current_spawned_id = BITS_SPAWNED self.current_spawned_id = BITS_SPAWNED
self.world_data = None self.world_data = None
@@ -138,8 +138,8 @@ class WorldServer(Server):
async def init_network(self): async def init_network(self):
await super().init_network() await super().init_network()
self.external_address = self.external_address[0], self._address[1] # update port (for OS-chosen port) self.external_address = self.external_address[0], self._address[1] # update port (for OS-chosen port)
with self.multi:
self.db.servers[self.external_address] = self.world_id self.db.servers[self.external_address] = self.world_id
self.conn.transaction_manager.commit()
def check_shutdown(self): def check_shutdown(self):
# shut down instances with no players every 60 minutes # shut down instances with no players every 60 minutes
@@ -154,8 +154,8 @@ class WorldServer(Server):
for address in self.accounts.copy(): for address in self.accounts.copy():
self.close_connection(address, DisconnectReason.ServerShutdown) self.close_connection(address, DisconnectReason.ServerShutdown)
if self.external_address in self.db.servers: if self.external_address in self.db.servers:
with self.multi:
del self.db.servers[self.external_address] del self.db.servers[self.external_address]
self.conn.transaction_manager.commit()
asyncio.get_event_loop().stop() asyncio.get_event_loop().stop()
log.info("Shutdown complete") log.info("Shutdown complete")

View File

@@ -119,7 +119,7 @@ class Init:
# tasks # tasks
tasks = [] tasks = []
for task_type, target, target_group, target_value, parameter in self.cdclient.execute("select taskType, target, targetGroup, targetValue, taskParam1 from MissionTasks where id = "+str(id)): for task_type, target, target_group, target_value, parameter in self.cdclient.execute("select taskType, target, targetGroup, targetValue, taskParam1 from MissionTasks where id = "+str(id)):
if task_type in (TaskType.KillEnemy, TaskType.Script, TaskType.QuickBuild, TaskType.ObtainItem, TaskType.MissionComplete, TaskType.TamePet): if task_type in (TaskType.KillEnemy, TaskType.Script, TaskType.QuickBuild, TaskType.ObtainItem, TaskType.MissionComplete, TaskType.CollectPowerup, TaskType.TamePet):
target = target, target = target,
if target_group: if target_group:
target += tuple(int(target_id) for target_id in target_group.split(",")) target += tuple(int(target_id) for target_id in target_group.split(","))