From 77c0e9aa049b8cdcf0049e83856d91400a43ffd1 Mon Sep 17 00:00:00 2001 From: lcdr Date: Fri, 23 Dec 2016 09:58:25 +0100 Subject: [PATCH] v2016.12.23 --- luserver/components/char.py | 5 +---- luserver/components/rail.py | 5 +++++ luserver/components/scripted_activity.py | 12 +++++++++++- luserver/components/skill.py | 10 ++++++---- luserver/game_object.py | 2 ++ .../general/transfer_to_last_non_instance.py | 14 ++++++++++++++ runtime/db/init.py | 5 +++++ runtime/db/luz_importer.py | 4 +++- runtime/db/scripts.py | 4 +++- 9 files changed, 50 insertions(+), 11 deletions(-) create mode 100644 luserver/scripts/general/transfer_to_last_non_instance.py diff --git a/luserver/components/char.py b/luserver/components/char.py index d5831ce..21b1e7d 100644 --- a/luserver/components/char.py +++ b/luserver/components/char.py @@ -1,4 +1,3 @@ -import asyncio import logging import random @@ -566,12 +565,10 @@ class CharacterComponent(Component): def match_request(self, address, activator:c_int64=None, player_choices:"ldf"=None, type:c_int=None, value:c_int=None): # todo: how does the server know which matchmaking activity the client wants? self.object._v_server.send_game_message(self.match_response, response=0, address=address) - if type == MatchRequestType.Join and value == MatchRequestValue.Join: + if type == MatchRequestType.Join:# and value == MatchRequestValue.Join: update_data = {} update_data["time"] = c_float, 60 self.object._v_server.send_game_message(self.match_update, data=update_data, type=MatchUpdateType.Time, address=address) - elif type == MatchRequestType.Ready and value == MatchRequestValue.Ready: - asyncio.ensure_future(self.transfer_to_world((1101, 0, 0))) def match_response(self, address, response:c_int=None): pass diff --git a/luserver/components/rail.py b/luserver/components/rail.py index e8ba95f..3f77008 100644 --- a/luserver/components/rail.py +++ b/luserver/components/rail.py @@ -1,6 +1,11 @@ from .component import Component class RailActivatorComponent(Component): + def __init__(self, obj, set_vars, comp_id): + super().__init__(obj, set_vars, comp_id) + self.rail_path = set_vars.get("rail_path", "") + self.rail_path_start = set_vars.get("rail_path_start", 0) + def serialize(self, out, is_creation): pass diff --git a/luserver/components/scripted_activity.py b/luserver/components/scripted_activity.py index 828c2ea..721bc35 100644 --- a/luserver/components/scripted_activity.py +++ b/luserver/components/scripted_activity.py @@ -1,11 +1,15 @@ -from ..bitstream import c_bit, c_float, c_int64, c_uint +import asyncio + +from ..bitstream import c_bit, c_float, c_int, c_int64, c_uint from .component import Component class ScriptedActivityComponent(Component): def __init__(self, obj, set_vars, comp_id): super().__init__(obj, set_vars, comp_id) + self.object.scripted_activity = self self._flags["players"] = "activity_flag" self.players = [] + self.comp_id = comp_id def serialize(self, out, is_creation): out.write(c_bit(self.activity_flag)) @@ -16,3 +20,9 @@ class ScriptedActivityComponent(Component): for _ in range(10): out.write(c_float(0)) self.activity_flag = False + + def message_box_respond(self, address, button:c_int=None, identifier:"wstr"=None, user_data:"wstr"=None): + if identifier == "LobbyReady" and button == 1: + player = self.object._v_server.accounts[address].characters.selected() + activity = self.object._v_server.db.activities[self.comp_id] + asyncio.ensure_future(player.char.transfer_to_world((activity[0], 0, 0))) diff --git a/luserver/components/skill.py b/luserver/components/skill.py index e9b7db6..9647266 100644 --- a/luserver/components/skill.py +++ b/luserver/components/skill.py @@ -98,6 +98,8 @@ class CastType: Consumable = 3 EverlastingConsumable = 4 +PASSIVE_BEHAVIORS = BehaviorTemplate.TargetCaster, BehaviorTemplate.Buff, BehaviorTemplate.SkillCastFailed, BehaviorTemplate.ApplyBuff + class SkillComponent(Component): def __init__(self, obj, set_vars, comp_id): super().__init__(obj, set_vars, comp_id) @@ -418,7 +420,7 @@ class SkillComponent(Component): if item.lot in self.object._v_server.db.object_skills: for skill_id in self.object._v_server.db.object_skills[item.lot]: behavior = self.object._v_server.db.skill_behavior[skill_id] - if behavior.template in (BehaviorTemplate.TargetCaster, BehaviorTemplate.Buff, BehaviorTemplate.ApplyBuff): + if behavior.template in PASSIVE_BEHAVIORS: if add_buffs: if hasattr(self.object, "char"): # update missions that have using this skill as requirement @@ -440,7 +442,7 @@ class SkillComponent(Component): def add_skill_server(self, skill_id): behavior = self.object._v_server.db.skill_behavior[skill_id] - if behavior.template in (BehaviorTemplate.TargetCaster, BehaviorTemplate.Buff, BehaviorTemplate.ApplyBuff): + if behavior.template in PASSIVE_BEHAVIORS: if hasattr(self.object, "char"): # update missions that have using this skill as requirement for mission in self.object.char.missions: @@ -454,12 +456,12 @@ class SkillComponent(Component): if item.lot in self.object._v_server.db.object_skills: for skill_id in self.object._v_server.db.object_skills[item.lot]: behavior = self.object._v_server.db.skill_behavior[skill_id] - if behavior.template in (BehaviorTemplate.TargetCaster, BehaviorTemplate.Buff, BehaviorTemplate.ApplyBuff): + if behavior.template in PASSIVE_BEHAVIORS: self.undo_behavior(behavior) else: self.object._v_server.send_game_message(self.remove_skill, skill_id=skill_id, address=self.object.char.address) def remove_skill_server(self, skill_id): behavior = self.object._v_server.db.skill_behavior[skill_id] - if behavior.template in (BehaviorTemplate.TargetCaster, BehaviorTemplate.Buff, BehaviorTemplate.ApplyBuff): + if behavior.template in PASSIVE_BEHAVIORS: self.undo_behavior(behavior) diff --git a/luserver/game_object.py b/luserver/game_object.py index fc961b7..a2fe18a 100644 --- a/luserver/game_object.py +++ b/luserver/game_object.py @@ -25,6 +25,7 @@ from .components.rail import RailActivatorComponent from .components.rebuild import RebuildComponent from .components.render import RenderComponent from .components.script import ScriptComponent +from .components.scripted_activity import ScriptedActivityComponent from .components.skill import SkillComponent from .components.spawner import SpawnerComponent from .components.stats import StatsSubcomponent @@ -59,6 +60,7 @@ component[73] = MissionNPCComponent, # belongs to the other nonserialized compon component[49] = SwitchComponent, component[16] = VendorComponent, component[6] = BouncerComponent, +component[39] = ScriptedActivityComponent, component[75] = ExhibitComponent, component[2] = RenderComponent, diff --git a/luserver/scripts/general/transfer_to_last_non_instance.py b/luserver/scripts/general/transfer_to_last_non_instance.py new file mode 100644 index 0000000..e4bf200 --- /dev/null +++ b/luserver/scripts/general/transfer_to_last_non_instance.py @@ -0,0 +1,14 @@ +import asyncio + +import luserver.components.script as script +from luserver.bitstream import c_int + +class ScriptComponent(script.ScriptComponent): + def on_use(self, player, multi_interact_id): + assert multi_interact_id is None + self.object._v_server.send_game_message(player.char.display_message_box, show=True, callback_client=self.object.object_id, identifier="instance_exit", image_id=0, text=self.script_vars.get("transfer_text", "DRAGON_EXIT_QUESTION"), user_data="", address=player.char.address) + + def message_box_respond(self, address, button:c_int=None, identifier:"wstr"=None, user_data:"wstr"=None): + if identifier == "instance_exit" and button == 1: + player = self.object._v_server.accounts[address].characters.selected() + asyncio.ensure_future(player.char.transfer_to_world(((player.char.world[0] // 100)*100, player.char.world[1], player.char.world[2]))) diff --git a/runtime/db/init.py b/runtime/db/init.py index 91d3d21..942ed62 100644 --- a/runtime/db/init.py +++ b/runtime/db/init.py @@ -339,6 +339,7 @@ if GENERATE_COMPS: root.destructible_component = BTrees.IOBTree.BTree() root.vendor_component = BTrees.IOBTree.BTree() root.inventory_component = BTrees.IOBTree.BTree() + root.activities = BTrees.IOBTree.BTree() root.rebuild_component = BTrees.IOBTree.BTree() root.package_component = BTrees.IOBTree.BTree() root.launchpad_component = BTrees.IOBTree.BTree() @@ -390,6 +391,10 @@ if GENERATE_COMPS: for comp_row in cdclient.execute("select itemid, equip from InventoryComponent where id == %i" % row[2]): root.inventory_component.setdefault(row[2], []).append((comp_row[0], comp_row[1])) + elif row[1] == 39 and row[2] not in root.activities: + for comp_row in cdclient.execute("select instanceMapID from Activities where ActivityID == %i" % row[2]): + root.activities[row[2]] = comp_row + elif row[1] == 48 and row[2] not in root.rebuild_component: comp_row = cdclient.execute("select complete_time, time_before_smash, reset_time, take_imagination, activityID from RebuildComponent where id == %i" % row[2]).fetchone() if comp_row is not None: diff --git a/runtime/db/luz_importer.py b/runtime/db/luz_importer.py index 118d7d3..7568a0e 100644 --- a/runtime/db/luz_importer.py +++ b/runtime/db/luz_importer.py @@ -54,7 +54,7 @@ class PathType: Race = 6 Rail = 7 -WHITELISTED_SERVERSIDE_LOTS = 176, 2292, 3964, 4734, 4764, 4860, 4945, 5633, 5652, 6247, 6396, 6464, 6465, 6466, 6700, 6842, 6958, 6960, 7085, 7608, 7973, 8139, 8419, 9930, 10009, 10042, 10413, 10496, 11165, 11178, 11274, 11279, 11280, 11281, 12232, 12384, 12661, 13142, 13834, 13835, 13881, 13882, 14013, 14031, 14086, 14087, 14199, 14214, 14215, 14216, 14217, 14218, 14220, 14225, 14226, 14242, 14243, 14244, 14245, 14246, 14248, 14249, 14289, 14290, 14291, 14292, 14293, 14294, 14330, 14331, 14332, 14333, 14345, 14346, 14347, 14348, 14510, 14530, 15902, 16506, 16513, 16627 +WHITELISTED_SERVERSIDE_LOTS = 176, 2292, 3964, 4734, 4764, 4860, 4945, 5633, 5652, 6247, 6396, 6464, 6465, 6466, 6700, 6842, 6958, 6960, 7085, 7608, 7973, 8139, 8419, 9930, 10009, 10042, 10413, 10496, 11165, 11178, 11182, 11274, 11279, 11280, 11281, 12232, 12384, 12661, 13142, 13834, 13835, 13881, 13882, 14013, 14031, 14086, 14087, 14199, 14214, 14215, 14216, 14217, 14218, 14220, 14225, 14226, 14242, 14243, 14244, 14245, 14246, 14248, 14249, 14289, 14290, 14291, 14292, 14293, 14294, 14330, 14331, 14332, 14333, 14345, 14346, 14347, 14348, 14510, 14530, 15902, 16477, 16506, 16513, 16627 EVENT_NAMES = {} EVENT_NAMES["OnActivated"] = "on_activated" @@ -177,6 +177,8 @@ def lvl_parse_chunk_type_2001(lvl, conn, world_data, triggers): script_vars["teleport_respawn_point_name"] = config["teleGroup"] if "TouchCompleteID" in config: script_vars["touch_complete_mission_id"] = config["TouchCompleteID"] + if "transferText" in config: + script_vars["transfer_text"] = config["transferText"] if "transferZoneID" in config: script_vars["transfer_world_id"] = int(config["transferZoneID"]) diff --git a/runtime/db/scripts.py b/runtime/db/scripts.py index 24e9562..c2bccac 100644 --- a/runtime/db/scripts.py +++ b/runtime/db/scripts.py @@ -38,9 +38,10 @@ SCRIPTS[1582] = "items.maelstrom_vacuum" SCRIPTS[1586] = "avant_gardens.caged_bricks" SCRIPTS[1641] = "ninjago.ninja" SCRIPTS[1647] = "ninjago.ninja" +SCRIPTS[1696] = "ninjago.treasure_chest" +SCRIPTS[1709] = "general.transfer_to_last_non_instance" SCRIPTS[1712] = "ninjago.ninja" SCRIPTS[1713] = "ninjago.ninja" -SCRIPTS[1696] = "ninjago.treasure_chest" SCRIPTS[r"02_server\Map\AG\L_AG_LASER_SENSOR_SERVER.lua"] = "avant_gardens.laser_sensor" SCRIPTS[r"02_server\Map\General\L_POI_MISSION.lua"] = "general.poi_mission" SCRIPTS[r"02_server\Map\General\L_TOUCH_MISSION_UPDATE_SERVER.lua"] = "general.touch_complete_mission" @@ -58,6 +59,7 @@ SCRIPTS[r"ai\AG\L_AG_SHIP_PLAYER_SHOCK_SERVER.lua"] = "venture_explorer.broken_c SCRIPTS[r"ai\AG\L_AG_SHIP_SHAKE.lua"] = "venture_explorer.ship_shake" SCRIPTS[r"ai\FV\L_ACT_BOUNCE_OVER_WALL.lua"] = "forbidden_valley.bounce_over_wall" SCRIPTS[r"ai\GF\L_GF_JAIL_WALLS.lua"] = "gnarled_forest.jail_walls" +SCRIPTS[r"ai\GENERAL\L_INSTANCE_EXIT_TRANSFER_PLAYER_TO_LAST_NON_INSTANCE.lua"] = "general.transfer_to_last_non_instance" SCRIPTS[r"ai\NS\L_NS_JONNY_FLAG_MISSION_SERVER.lua"] = "nimbus_station.johnny_thunder" SCRIPTS[r"ai\NS\L_NS_QB_IMAGINATION_STATUE.lua"] = "nimbus_station.imagination_statue" SCRIPTS[r"ai\NS\NS_PP_01\L_NS_PP_01_TELEPORT.lua"] = "property.teleport"