From 71d396082d4fe223dfdbc797d39b87f786b74d72 Mon Sep 17 00:00:00 2001 From: wesleyd1124 Date: Sat, 19 May 2018 20:18:01 -0400 Subject: [PATCH] Mission Stuff --- DBHandlers.py | 11 +++++----- ReplicaPacket.py | 3 +++ ScriptedEvents.py | 17 +++++++++++++++ World.py | 54 ++++++++++++++++++++++++++++++++++++---------- server.sqlite | Bin 49152 -> 49152 bytes 5 files changed, 69 insertions(+), 16 deletions(-) create mode 100644 ScriptedEvents.py diff --git a/DBHandlers.py b/DBHandlers.py index 735b4ba..473c650 100644 --- a/DBHandlers.py +++ b/DBHandlers.py @@ -135,15 +135,16 @@ class databaseManager(): return q - def getApplicableMission(self, player, offerer): + def getApplicableMission(self, offerer, currentMissions, completedMissions): conn = self.cdConn c = conn.cursor() - completed = self.getCompletedMissions(player) + c.execute("SELECT id FROM Missions WHERE target_objectID = "+str(offerer)) + finishMissions = c.fetchall() + for mission in finishMissions: + if(mission[0] in currentMissions): + return int(mission[0]) c.execute("SELECT id, prereqMissionID FROM Missions WHERE offer_objectID = "+str(offerer)) missions = c.fetchall() - completedMissions = [] - for mission in completed: - completedMissions.append(int(mission[0])) for mission in missions: display = True required = str(mission[1]).split("|") diff --git a/ReplicaPacket.py b/ReplicaPacket.py index fb208d1..85435f7 100644 --- a/ReplicaPacket.py +++ b/ReplicaPacket.py @@ -788,6 +788,9 @@ class GameObject(): self.respawn = None self.onInteraction = None self.Loading = False + self.CurrentMissions = [] + self.CompletedMissions = [] + self.CurrentMissionStates = {} def getLOT(self): if(self.tag != "Drop"): return unpack("l", self.components[0].LOT)[0] diff --git a/ScriptedEvents.py b/ScriptedEvents.py new file mode 100644 index 0000000..219cadf --- /dev/null +++ b/ScriptedEvents.py @@ -0,0 +1,17 @@ + + + +class EventManager: + def __init__(self): + #Takes in the following values + #Name (a string) + #EventType (a string) + #HandlingFunction (a function that has 1 argument that is an array) + self.Events = [] + def registerEvent(self, Name, Type, HandlingFunction): + self.Events.append({"Name":Name, "EventType":Type, "HandlingFunction":HandlingFunction}) + def runEvent(self, EventType, Arguments): + for event in self.Events: + if(EventType == event["EventType"]): + print(event["Name"] + " was triggered") + event["HandlingFunction"](Arguments) diff --git a/World.py b/World.py index 4402adf..ff57cce 100644 --- a/World.py +++ b/World.py @@ -19,8 +19,9 @@ from difflib import SequenceMatcher from ReplicaPacket import * from LDFReader import * import atexit +import copy from LVLParser import * - +from ScriptedEvents import * @@ -34,6 +35,9 @@ class WorldServer(server.Server): self.unhandledGMs = [] self.RM = ReplicaManager(self) self.GM = GameMessages(self) + self.EM = EventManager() + + self.EM.registerEvent("Unlock Imagination Pickup", "GM_486", self.UnlockImaginationHandler) updateLoop = Thread(target=self.updateLoop) updateLoop.start() @@ -41,6 +45,24 @@ class WorldServer(server.Server): initGameObjects = Thread(target=self.spawnInitWorldObjects) initGameObjects.start() + def UnlockImaginationHandler(self, Arguments): + objectID = Arguments[0] + player = Arguments[1].read(c_longlong) + if(664 in self.SavedObjects[player].CurrentMissions and objectID not in self.SavedObjects): + task = self.DB.getMissionTaskType(664)[0][0] + + NotifyMissionTask = self.GM.InitGameMessage(255, player) + NotifyMissionTask.write(c_int(664)) + NotifyMissionTask.write(c_int(1 << (task + 1))) + update = BitStream() + update.write(c_float(2210+(objectID<<8))) + NotifyMissionTask.write(c_uint8(update.__len__())) + NotifyMissionTask.write(update) + + session = self.DB.getSessionByCharacter(player) + self.send(NotifyMissionTask, (str(session[2]), int(session[7]))) + + def addSkill(self, objectID, skillID, AICombatWeight=0, fromSkillSet=False, castType=0, timeSecs=-1, timesCanCast=-1, slotID=-1, temporary=True): packet = self.GM.InitGameMessage(124, objectID) packet.write(c_int(AICombatWeight)) @@ -61,7 +83,7 @@ class WorldServer(server.Server): def handleInteraction(self, multiInteractionUse, multiInteractionID, multiInteractionType, object, secondary, player): LOT = int(self.SavedObjects[object].getLOT()) - mission = self.DB.getApplicableMission(player, LOT) + mission = self.DB.getApplicableMission(LOT, self.SavedObjects[player].CurrentMissions, self.SavedObjects[player].CompletedMissions) if(mission is not None): self.offerMission(player, mission, object) elif(self.SavedObjects[object].onInteraction != None): @@ -148,7 +170,8 @@ class WorldServer(server.Server): if(SpawnIn): self.log("Initialized Object With LOT " + str(LOT) + " In Zone " + str(Object["Zone"])) self.createObject("", LOT, objectID, Object["Zone"], Object["XPos"], Object["YPos"], Object["ZPos"], Object["XRot"], Object["YRot"], Object["ZRot"], Object["WRot"], Register=False, Init=True, - smashable=smashable, Respawn=respawn, serverScript=custom_server_script, Scale=Object["Scale"], zoneTrasnferInteraction=zoneTransferInteraction, Tag=Tag) + smashable=smashable, Respawn=respawn, serverScript=custom_server_script, Scale=Object["Scale"], zoneTrasnferInteraction=zoneTransferInteraction, Tag=Tag, + spawnerObjectID=Object["ObjectID"]) self.log("Finished Initializing Objects") def updatePlayerLoc(self, objectID, xPos, yPos, zPos, xRot, yRot, zRot, wRot): @@ -264,7 +287,7 @@ class WorldServer(server.Server): self.createObject(0, 0, 0, zoneID, 0, 0, 0, 0, 0, 0, 0, RO=obj, Register=False, Address=address) def createObject(self, Name, LOT, ObjectID, zone, xPos, yPos, zPos, xRot, yRot, zRot, wRot, RO=None, Init=False, message=None, Register=True, Scale=1, currentHealth=1, maxHealth=1, currentArmor=0, maxArmor=0, currentImagination=0, maxImagination=0, smashable=False, level=1, - collectibleID=2210, Tag="", Address=None, Respawn=None, serverScript=None, triggerID=None, zoneTrasnferInteraction=None): + collectibleID=2210, Tag="", Address=None, Respawn=None, serverScript=None, triggerID=None, zoneTrasnferInteraction=None, spawnerObjectID=None): if(RO != None): if(Register == True): self.DB.registerWorldObject(Name, LOT, ObjectID, zone, xPos,yPos, zPos, xRot, yRot, zRot, wRot, self.RM._current_network_id) @@ -297,6 +320,9 @@ class WorldServer(server.Server): obj.Name = Name if(triggerID != None): obj.trigger = True + if(spawnerObjectID != None): + obj.SpawnerObjID = c_longlong(spawnerObjectID) + obj.flag3 = True obj.NameLength = Name.__len__() obj.Scale = c_float(Scale) adjCompList = [] @@ -958,6 +984,10 @@ class WorldServer(server.Server): player = GameObject() player.components = PlayerComponents player.tag = "Player" + for mission in completedMissions: + player.CompletedMissions.append(mission) + for mission in currentMissions: + player.CompletedMissions.append(mission) self.createObject(characterData[2], 1, int(characterData[3]), zoneID, int(characterData[17]), int(characterData[18]), int(characterData[19]), 0.0, 0.0, 0.0, 0.0, RO=player, message="Sent Player Construction") self.GM.SendGameMessage(1642, int(characterData[3]), address)#Server done loading all objects @@ -967,6 +997,7 @@ class WorldServer(server.Server): message = BitStream(data[7:]) objID = message.read(c_longlong) msgID = message.read(c_ushort) + self.EM.runEvent("GM_"+str(msgID), [objID, copy.deepcopy(message)]) if(str(msgID) == "1485"): return elif(str(msgID) == "41"): @@ -998,15 +1029,13 @@ class WorldServer(server.Server): except: pass if(reward != None): - print("Reward: " + str(reward)) - None#TODO: Give Reward + print("Reward: " + str(reward))#TODO: Give award? elif(str(msgID) == "520"): complete = message.read(c_bit) state = message.read(c_int) missionID = message.read(c_int) responder = message.read(c_longlong) - task = self.DB.getMissionTaskType(missionID)[0][0] NotifyMissionTask = self.GM.InitGameMessage(255, responder) @@ -1019,12 +1048,15 @@ class WorldServer(server.Server): NotifyMission.write(c_int(missionID)) if(complete == False): NotifyMission.write(c_int(2)) # Mission state: Active - else: - NotifyMission.write(c_int(4)) #Mission State: Complete + self.SavedObjects[responder].CurrentMissions.append(missionID) + self.SavedObjects[responder].CurrentMissionStates[missionID] = 0 + else:#Mission was completed + self.SavedObjects[responder].CurrentMissions.remove(missionID) + self.SavedObjects[responder].CompletedMissions.append(missionID) + del self.SavedObjects[responder].CurrentMissionStates[missionID] + NotifyMission.write(c_int(8)) #Mission state: Completed NotifyMission.write(c_bit(False)) # Sending rewards self.send(NotifyMission, address) - - self.DB.addCurrentMission(responder, missionID) elif(str(msgID) == "124"): #SelectSkill fromSkillSet = message.read(c_bit) diff --git a/server.sqlite b/server.sqlite index 1f2e97b936b3f6d8519e3d8e1e7f331c7b94a38a..30e3181add3792775f8036d3890e05ff44b76997 100644 GIT binary patch delta 294 zcmZo@U~Xt&o*>0kVLMUAiLJtxLH8N=#uRUTekO5l5oSrI@cg2jlw#(H$@}z87!Pj# ztj`+27_s?h{e6BnM@|M#d093lPG&CZS(Tv|Nog^FkF@6 zWdH&J1_u5BY;d!nfDwNPA2$md69-Hi+kT*q1!(*UX#55=egPUkVe*psN){+a8lWjr XK;sJ__?!RDzr)YeBEI>~dKCcxHbG}t delta 204 zcmZo@U~Xt&o*>0kK6|2!6I=Og20g~8jVa#x{EYv(MVKX-!t;xAQi_=!ChyZXVO+8K zvp#D8qr>K(_4oO0G&mVJGOOe}|u`xqkDV^(q1Yr|>_@