mirror of
https://github.com/lcdr/luserver.git
synced 2025-12-19 20:49:51 -06:00
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:
@@ -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
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
for _ in range(min(self.num_to_maintain, len(self.waypoints))):
|
self.spawn_all()
|
||||||
self.spawn()
|
|
||||||
|
def spawn_all(self):
|
||||||
|
for _ in range(min(self.num_to_maintain, len(self.waypoints))):
|
||||||
|
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
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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)
|
||||||
self.db.servers[self.external_address] = self.world_id
|
with self.multi:
|
||||||
self.conn.transaction_manager.commit()
|
self.db.servers[self.external_address] = self.world_id
|
||||||
|
|
||||||
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:
|
||||||
del self.db.servers[self.external_address]
|
with self.multi:
|
||||||
self.conn.transaction_manager.commit()
|
del self.db.servers[self.external_address]
|
||||||
asyncio.get_event_loop().stop()
|
asyncio.get_event_loop().stop()
|
||||||
log.info("Shutdown complete")
|
log.info("Shutdown complete")
|
||||||
|
|
||||||
|
|||||||
@@ -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(","))
|
||||||
|
|||||||
Reference in New Issue
Block a user