def onKill(self, npc, player, isPet): world = self.getWorld(npc) if not isinstance(world, MyInstanceWorld): return if npc.getNpcId() == self.wave1mobid: world.wave1killed += 1 if world.wave1killed >= self.killcountspawnstrongmob: x, y, z = self.wave2mobspawnloc[Rnd.get( 0, len(self.wave2mobspawnloc) - 1)] x, y, z = self.getRandomXYZ(x, y, z, 100) n = self.spawnNpc(self.wave2mobid, x, y, z, 0, world.instanceId) p = self.getRandomPlayer(world) self.addHate(world, n, p) if npc.getNpcId() == self.bossid: self.broadcastMessage( world.instanceId, "%s 殺死了 %s 副本成功" % (player.getName(), npc.getName())) self.broadcastScreenMessage(world.instanceId, "副本成功") InstanceManager.getInstance().getInstance( world.instanceId).setDuration(1000 * 60 * 5) x, y, z = self.entryLoc self.spawnNpc(self.NPCID, x, y, z, 0, world.instanceId) world.stage, world.step = 4, 0
def useVoicedCommand(self, command, player, params): world = InstanceManager.getInstance().getWorld(player.getInstanceId()) if world and world.templateId >= 0: sm = SystemMessage.getSystemMessage(SystemMessageId.INSTANT_ZONE_CURRENTLY_INUSE_S1) sm.addInstanceName(world.templateId) player.sendPacket(sm) instanceTimes = InstanceManager.getInstance().getAllInstanceTimes(player.getObjectId()) hasMessage = False if instanceTimes: for instanceId in instanceTimes.keySet(): remainingTime = (instanceTimes.get(instanceId) - System.currentTimeMillis()) / 1000 if remainingTime > 60: if not hasMessage: hasMessage = True player.sendPacket(SystemMessageId.INSTANCE_ZONE_TIME_LIMIT) hours = (int) (remainingTime / 3600) minutes = (int) ((remainingTime%3600) / 60) sm = SystemMessage.getSystemMessage(SystemMessageId.AVAILABLE_AFTER_S1_S2_HOURS_S3_MINUTES) sm.addInstanceName(instanceId) sm.addNumber(hours) sm.addNumber(minutes) player.sendPacket(sm) else: InstanceManager.getInstance().deleteInstanceTime(player.getObjectId(), instanceId) if not hasMessage: player.sendPacket(SystemMessageId.NO_INSTANCEZONE_TIME_LIMIT) return
def onAdvEvent(self, event, npc, player): try: nEvent = int(event) except: nEvent = -1 if nEvent in self.gb_list.keys(): if player.isGM(): self.gb_list[nEvent][2][0](self, self.gb_list[nEvent][2][1:]) else: return self.htm_header + self.htm_no_rights + self.htm_footer if event == "IFS": if player.isGM(): self.icefairysirra_unlock() else: return self.htm_header + self.htm_no_rights + self.htm_footer if event.startswith("reset "): event = event.split()[1] self.reset_queststate(player, event) if event.startswith("show_require "): event = event.split()[1] return self.htm_header + self.show_require_item(event) + self.htm_footer if event.startswith("del_instance "): st = player.getQuestState(self.qn) event = event.split()[1] for dummy,instance_id,require in self.reset_instance: if str(instance_id) == event: if not self.check_require_item(player, require): return self.htm_header + self.htm_not_enough_item + self.htm_footer map(lambda (item_id, count): st.takeItems(item_id, count), require) InstanceManager.getInstance().deleteInstanceTime(player.getObjectId(), int(event)) break return self.onFirstTalk(npc, player)
def useVoicedCommand(self, command, player, params): world = InstanceManager.getInstance().getWorld(player.getInstanceId()) if world and world.templateId >= 0: sm = SystemMessage.getSystemMessage( SystemMessageId.INSTANT_ZONE_CURRENTLY_INUSE_S1) sm.addInstanceName(world.templateId) player.sendPacket(sm) instanceTimes = InstanceManager.getInstance().getAllInstanceTimes( player.getObjectId()) hasMessage = False if instanceTimes: for instanceId in instanceTimes.keySet(): remainingTime = (instanceTimes.get(instanceId) - System.currentTimeMillis()) / 1000 if remainingTime > 60: if not hasMessage: hasMessage = True player.sendPacket( SystemMessageId.INSTANCE_ZONE_TIME_LIMIT) hours = (int)(remainingTime / 3600) minutes = (int)((remainingTime % 3600) / 60) sm = SystemMessage.getSystemMessage( SystemMessageId.AVAILABLE_AFTER_S1_S2_HOURS_S3_MINUTES) sm.addInstanceName(instanceId) sm.addNumber(hours) sm.addNumber(minutes) player.sendPacket(sm) else: InstanceManager.getInstance().deleteInstanceTime( player.getObjectId(), instanceId) if not hasMessage: player.sendPacket(SystemMessageId.NO_INSTANCEZONE_TIME_LIMIT) return
def getWorld(self, player=None, instanceId=None): if player and isinstance(player, L2Object): return InstanceManager.getInstance().getWorld(player.getInstanceId()) # return InstanceManager.getInstance().getPlayerWorld(player) if instanceId: return InstanceManager.getInstance().getWorld(instanceId) return None
def getWorld(self, player=None, instanceId=None): if player and isinstance(player, L2Object): return InstanceManager.getInstance().getWorld( player.getInstanceId()) #return InstanceManager.getInstance().getPlayerWorld(player) if instanceId: return InstanceManager.getInstance().getWorld(instanceId) return None
def deleteInstanceTime(self, player_oid, instance_id): st = player.getQuestState(self.qn) if not st: return False for dummy,rinstance_id,require in self.reset_instance: if str(rinstance_id) == instance_id: if not self.check_require_item(player, require): return self.htm_header + self.htm_not_enough_item + self.htm_footer map(lambda (item_id, count): st.takeItems(item_id, count), require) InstanceManager.getInstance().deleteInstanceTime(player.getObjectId(), rinstance_id) break
def onKill(self, npc, player, isPet) : npcId = npc.getNpcId() partyMembers = [player] party = player.getParty() if npc.getInstanceId() in self.worlds: world = self.worlds[npc.getInstanceId()] if npcId in RAIDS3 : #If is party, give item to all party member who have quest if party : partyMembers = party.getPartyMembers().toArray() for player in partyMembers : st = player.getQuestState(qn) if st : Reward(st) else : st = player.getQuestState(qn) if st : Reward(st) if self.worlds.has_key(npc.getInstanceId()): world = self.worlds[npc.getInstanceId()] instanceObj = InstanceManager.getInstance().getInstance(self.currentWorld) instanceObj.setDuration(60000) instanceObj.removeNpcs() elif npcId in RAIDS1 : spawnRaid(self, world, 2) elif npcId in RAIDS2 : spawnRaid(self, world, 3) return
def enterInstance(self,player,template,teleto,quest): instanceId = 0 # Create instance instanceId = InstanceManager.getInstance().createDynamicInstance(template) if not self.worlds.has_key(instanceId): world = PyObject() world.instanceId = instanceId self.worlds[instanceId] = world self.world_ids.append(instanceId) instance = InstanceManager.getInstance().getInstance(instanceId) instance.setAllowSummon(False) print "菲拉卡-惡魔的遺產 (等級 61-67):"+ template +" 即時地區:" + str(instanceId) + " 創造玩家:" + str(player.getName()) # Teleports player teleto.instanceId = instanceId teleportplayer(self,player,teleto) return instanceId
def onAdvEvent (self,event,npc,player) : htmltext = event st = player.getQuestState(qn) if not st : return if event == "32138-03.htm" : st.set("cond","1") st.setState(State.STARTED) st.playSound("ItemSound.quest_accept") elif event == "32258-08.htm" : st.giveItems(PUMA_SKIN_SHIRT, 1) st.giveItems(PUMA_SKIN_GAITERS, 1) st.unset("cond") st.exitQuest(False) st.playSound("ItemSound.quest_finish") elif event == "32258-09.htm" : if st.getRandom(100) < 50 : st.giveItems(MECKLACE_OF_DEVOTION, 1) st.giveItems(RING_OF_DEVOTION, 1) else : st.giveItems(RED_CRESCENT_EARRING, 2) st.unset("cond") st.exitQuest(False) st.playSound("ItemSound.quest_finish") elif event == "quit" : instanceId = player.getInstanceId() instance = InstanceManager.getInstance().getInstance(instanceId) player.setInstanceId(0) player.teleToLocation(-74058,52040,-3680) htmltext = "" return htmltext
def enterInstance(self, player, template, teleto) : instanceId = 0 if not checkCondition(player) : return 0 party = player.getParty() # Check for existing instances of party members for partyMember in party.getPartyMembers().toArray() : if partyMember.getInstanceId() != 0 : instanceId = partyMember.getInstanceId() # New instance else : instanceId = InstanceManager.getInstance().createDynamicInstance(template) if not self.worlds.has_key(instanceId) : world = PyObject() world.instanceId = instanceId self.worlds[instanceId] = world self.world_ids.append(instanceId) print "Tower of Infinity: started " + template + " Instance: " +str(instanceId) + " created by player: " + str(player.getName()) runFloor(self, world, 0) # teleports player for partyMember in party.getPartyMembers().toArray() : st = partyMember.getQuestState(qn) if not st : st = self.newQuestState(partyMember) teleto.instanceId = instanceId teleportPlayer(self, partyMember, teleto) return instanceId return instanceId
def onAdvEvent (self,event,npc,player) : htmltext = event st = player.getQuestState(qn) if not st : return if event == "32138-03.htm" : st.set("cond","1") st.setState(State.STARTED) st.playSound("ItemSound.quest_accept") elif event == "32258-04.htm" : st.giveItems(RED_CRESCENT_EARRING, 2) st.unset("cond") st.exitQuest(False) st.playSound("ItemSound.quest_finish") elif event == "32258-05.htm" : st.giveItems(RING_OF_DEVOTION, 2) st.unset("cond") st.exitQuest(False) st.playSound("ItemSound.quest_finish") elif event == "quit" : instanceId = player.getInstanceId() instance = InstanceManager.getInstance().getInstance(instanceId) player.setInstanceId(0) player.teleToLocation(-74058,52040,-3680) htmltext = "" return htmltext
def onKill(self, npc, player, isPet) : npcId = npc.getNpcId() partyMembers = [player] party = player.getParty() if npc.getInstanceId() in self.worlds: world = self.worlds[npc.getInstanceId()] if npcId in RAIDS3 : #If is party, give item to all party member who have quest if party : partyMembers = party.getPartyMembers().toArray() for player in partyMembers : st = player.getQuestState(qn) if st : Reward(st) else : st = player.getQuestState(qn) if st : Reward(st) if self.worlds.has_key(npc.getInstanceId()): world = self.worlds[npc.getInstanceId()] instanceObj = InstanceManager.getInstance().getInstance(self.currentWorld) instanceObj.setDuration(60000) instanceObj.removeNpcs() elif npcId in RAIDS1 : spawnRaid(self, world, 2) elif npcId in RAIDS2 : spawnRaid(self, world, 3) return
def getAllInstancePlayers(self, instanceId): p = [] i = InstanceManager.getInstance().getInstance(instanceId) if i: for pid in i.getPlayers().toArray(): player = L2World.getInstance().getPlayer(pid) if player: p += [player] return p
def getAllInstancePlayers(self, instanceId): p = [] i = InstanceManager.getInstance().getInstance(instanceId) if i: for pid in i.getPlayers().toArray(): player = L2World.getInstance().getPlayer(pid) if player: p += [player] return p
def onTalk(self, npc, player): npcId = npc.getNpcId() st = player.getQuestState(qn) if not st : st = self.newQuestState(player) hellboundLevel = HellboundManager.getInstance().getLevel() if hellboundLevel < 10: return "<html><body>卡納夫:<br>你是誰?...<br>快滾開,我不想和你說話!</body></html>" if npcId == KANAF : party = player.getParty() if not party: return "32346-0.htm" if not checkCondition(player): return else : tele = PyObject() tele.x = 14205 tele.y = 255451 tele.z = -2025 instanceId = getExistingInstanceId(player) if instanceId == 0: instanceId = InstanceManager.getInstance().createDynamicInstance("HBTown.xml") if not self.worlds.has_key(instanceId): world = PyObject() world.rewarded=[] world.instanceId = instanceId world.instanceFinished = False world.guardsSpawned = False self.worlds[instanceId] = world self.world_ids.append(instanceId) self.currentWorld = instanceId print "地獄舊市區:使用即時地區:" +str(instanceId) + " 創造玩家:" + str(player.getName()) KLOC = KLOCS[Rnd.get(len(KLOCS))] newKeymaster = self.addSpawn(KEYMASTER,KLOC[0],KLOC[1],KLOC[2],KLOC[3],False,0,False,world.instanceId) self.keymaster = newKeymaster self.keymasterattacked = False newAmaskari = self.addSpawn(AMASKARI,19496,253125,-2030,0,False,0,False,world.instanceId) self.amaskari = newAmaskari self.amaskariattacked = False tele.instanceId = instanceId teleportPlayer(self,player,tele) party = player.getParty() if party != None: for partyMember in party.getPartyMembers().toArray(): teleportPlayer(self,partyMember,tele) else: for worldid in self.world_ids: if worldid == instanceId: foundworld = True if not worldid == instanceId: foundworld = False if not foundworld: player.sendPacket(SystemMessage.sendString("你的隊員已進入其它的即時地區。")) return tele.instanceId = instanceId teleportPlayer(self,player,tele) return
def getAllVisibleNpcs(self, world): npcs = [] if not isinstance(world, MyInstanceWorld): return npcs i = InstanceManager.getInstance().getInstance(world.instanceId) if not i: return npcs for n in i.getNpcs(): if L2World.getInstance().findObject(n.getObjectId()): npcs += [n] return npcs
def onAdvEvent (self, event, npc, player) : if event == "CheckTrustP": if self.trustp >= 500000: HellboundManager.getInstance().changeLevel(11) self.trustp = 0 self.saveGlobalQuestVar("trust10p", str(self.trustp)) self.cancelQuestTimers("CheckTrustP") elif event == "keySpawn1" or event == "keySpawn2": self.startQuestTimer("keySpawn2", 300000, None, None) loc = LOCS[Rnd.get(len(LOCS))] self.keymaster.teleToLocation(loc[0],loc[1],loc[2]) if event == "keySpawn1": self.startQuestTimer("keySpawn2", 300000, None, None) else: self.startQuestTimer("keySpawn1", 300000, None, None) elif event == "decayNpc": npc.decayMe() elif event == "NATIVESay": world = self.worlds[npc.getInstanceId()] npc.broadcastPacket(NpcSay(22450, 0, 22450, "我會...將...全部...打死...!")) npc.broadcastPacket(NpcSay(22450, 0, 22450, "我會...將...全部...打死...!")) npc.broadcastPacket(NpcSay(22450, 0, 22450, "我會...將...全部...打死...!")) elif event == "freeprisoner": world = self.worlds[npc.getInstanceId()] sayNpc = npc.getObjectId() npc.broadcastPacket(NpcSay(sayNpc, 0, npc.getNpcId(), "多謝幫助!看守者馬上就要來了快躲起來...")) self.startQuestTimer("decayNpc", 15000, npc, None) chance = Rnd.get(100) if chance <= 30: if not world.guardsSpawned: callGuards(self,npc,player,world) world.guardsSpawned = True npc.broadcastPacket(NpcSay(22359, 0, 22359, "發.現.入.侵.者...!")) hellboundLevel = HellboundManager.getInstance().getLevel() if hellboundLevel == 10: HellboundManager.getInstance().increaseTrust(50) self.trustp += 50 self.saveGlobalQuestVar("trust10p", str(self.trustp)) elif event == "key": world = self.worlds[npc.getInstanceId()] if not world.instanceFinished: key = player.getInventory().getItemByItemId(KEY); if key != None: world.instanceFinished = True player.destroyItemByItemId("Moonlight Stone", KEY, 1, player, True); instance = InstanceManager.getInstance().getInstance(npc.getInstanceId()) if instance != None: instance.setDuration(30000) instance.setReturnTeleport(ReturnPort[dataIndex][0],ReturnPort[dataIndex][1],ReturnPort[dataIndex][2]) else : return "32343-2.htm" else : return "32343-1.htm" return
def enterInstance(self,player,template,teleto,quest): instanceId = 0 if not checkCondition(player): return instanceId party = player.getParty() if party != None : channel = party.getCommandChannel() if channel != None : members = channel.getMembers().toArray() else: members = party.getPartyMembers().toArray() else: members = [] #check for exising instances of party members or channel members for member in members : if member.getInstanceId()!= 0 : instanceId = member.getInstanceId() #exising instance if instanceId != 0: foundworld = False for worldid in self.world_ids: if worldid == instanceId: foundworld = True if not foundworld: player.sendPacket(SystemMessage.sendString("你的隊員已進入其它的即時地區。")) return 0 teleto.instanceId = instanceId teleportplayer(self,player,teleto) return instanceId else: instanceId = InstanceManager.getInstance().createDynamicInstance(template) if not self.worlds.has_key(instanceId): world = PyObject() world.rewarded=[] world.instanceId = instanceId world.instanceFinished = False world.guardsSpawned = False world.status = 0 self.worlds[instanceId] = world self.world_ids.append(instanceId) print "地獄舊市區:使用 " + template + " 即時地區:" +str(instanceId) + " 創造玩家:" + str(player.getName()) newNpc = self.addSpawn(AMASKARI,19496,253125,-2030,0,False,0,False,instanceId) quest.amaskari = newNpc quest.amaskariattacked = False loc = LOCS[Rnd.get(len(LOCS))] newNpc = self.addSpawn(KEYMASTER,loc[0],loc[1],loc[2],0,False,0,False,instanceId) quest.keymaster = newNpc quest.startQuestTimer("keySpawn1", 300000, None, None) quest.keymasterattacked = False # teleports player teleto.instanceId = instanceId teleportplayer(self,player,teleto) return instanceId return instanceId
def onFirstTalk(self, npc, player): st = player.getQuestState(self.qn) if not st: st = self.newQuestState(player) st.setState(State.STARTED) lastInstanceId = st.getInt('instanceId') or None world = self.getWorld(player) if world: return self.htm_header + self.htm_exit + self.htm_footer if lastInstanceId: world = InstanceManager.getInstance().getWorld(lastInstanceId) if world and world.stage in [ 0, 1, 2, 3 ] and world.allowed.contains(player.getObjectId()): return self.htm_header + self.htm_reentry + self.htm_footer return self.htm_header + self.htm_go + self.htm_footer
def spawnNpc(self, npcId, x, y, z, heading, instId): npcTemplate = NpcTable.getInstance().getTemplate(npcId) inst = InstanceManager.getInstance().getInstance(instId) try: npcSpawn = L2Spawn(npcTemplate) npcSpawn.setLocx(x) npcSpawn.setLocy(y) npcSpawn.setLocz(z) #npcSpawn.setHeading(heading) npcSpawn.setAmount(1) npcSpawn.setInstanceId(instId) SpawnTable.getInstance().addNewSpawn(npcSpawn, False) npc = npcSpawn.doSpawn() #npc.setOnKillDelay(0) #npc.setRunning() return npc except: print "spawnNPC error"
def onAdvEvent(self, event, npc, player): htmltext = event st = player.getQuestState(qn) if not st: return if event == "31001-05.htm": st.set("cond", "1") st.setState(State.STARTED) st.playSound("ItemSound.quest_middle") elif event == "32576-02.htm": st.giveItems(IdentityCard, 1) st.set("cond", "2") st.playSound("ItemSound.quest_middle") elif event == "30289-04.htm": player.stopAllEffects() SkillTable.getInstance().getInfo(6204, 1).getEffects(player, player) st.set("cond", "3") elif event == "30289-07.htm": player.stopAllEffects() SkillTable.getInstance().getInfo(6204, 1).getEffects(player, player) elif event == "30289-08.htm": player.stopAllEffects() elif event == "30289-11.htm": st.set("cond", "4") st.playSound("ItemSound.quest_middle") player.stopAllEffects() elif event == "30969-03.htm": st.addExpAndSp(52518015, 5817677) st.unset("cond") st.exitQuest(False) st.playSound("ItemSound.quest_finish") elif event == "quit": instanceId = player.getInstanceId() instance = InstanceManager.getInstance().getInstance(instanceId) player.setInstanceId(0) player.teleToLocation(-12491, 122331, -2984) htmltext = "" return htmltext
def checkAllow(self, player, target): message = "" if not Util.checkIfInRange(2000, player, target, False): message = "%s 不在隊長範圍 2000 單位內" % target.getName() if not target.getLevel() >= 80: message = "%s 等級不足" % target.getName() if self.getQuestItemsCount( target, self.require_item_id) < self.require_item_count: message = "%s 所需道具不足 需要 %s %d 個" % (target.getName(), self.require_item_name, self.require_item_count) l, c = InstanceManager.getInstance().getInstanceTime( target.getObjectId(), self.InstanceTemplateId), System.currentTimeMillis() if l > c: message = "%s 副本時間限制 %d 秒後可用" % (target.getName(), (l - c) / 1000) if len(message) > 0: player.sendMessage(message) if player.getObjectId() != target.getObjectId(): target.sendMessage(message) return False return True
def onAdvEvent(self, event, npc, player): if event == "timer" or event == "timer2": if self.npcobject[npc.getObjectId()].correct == False: dx = npc.getX() - 142999 dy = npc.getY() - 151671 d = dx * dx + dy * dy if d < 10000: npc.broadcastPacket(MagicSkillUse(npc, npc, 5441, 1, 1, 0)) self.npcobject[npc.getObjectId()].correct = True self.worlds[npc.getInstanceId( )].correct = self.worlds[npc.getInstanceId()].correct + 1 if self.npcobject[npc.getObjectId()].correct == False: dx = npc.getX() - 139494 dy = npc.getY() - 151668 d = dx * dx + dy * dy if d < 10000: npc.broadcastPacket(MagicSkillUse(npc, npc, 5441, 1, 1, 0)) self.npcobject[npc.getObjectId()].correct = True self.worlds[npc.getInstanceId( )].correct = self.worlds[npc.getInstanceId()].correct + 1 if self.worlds[npc.getInstanceId()].correct >= 2: for door in InstanceManager.getInstance().getInstance( npc.getInstanceId()).getDoors(): if door.getDoorId() == 24220026: door.openMe() return if self.npcobject[npc.getObjectId()].lastitem: L2World.getInstance().removeVisibleObject( self.npcobject[npc.getObjectId()].lastitem, self.npcobject[ npc.getObjectId()].lastitem.getWorldRegion()) L2World.getInstance().removeObject( self.npcobject[npc.getObjectId()].lastitem) if len(self.npcobject[npc.getObjectId()].walklist_order) == 0: return for item in self.npcobject[npc.getObjectId()].walklist_order: crystal = self.npcobject[npc.getObjectId()].walklist[item] newpos = Location(crystal.getX(), crystal.getY(), crystal.getZ(), 0) npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, newpos, True) # L2EMU-VCT self.npcobject[npc.getObjectId()].lastitem = crystal self.npcobject[npc.getObjectId()].walklist_order.remove(item) break if (len(self.npcobject[npc.getObjectId()].walklist_order)) > 0: if event == "timer": self.startQuestTimer("timer2", 2000, npc, None) else: self.startQuestTimer("timer", 2000, npc, None) else: if self.npcobject[npc.getObjectId()].last == False: self.npcobject[npc.getObjectId()].last = True if event == "timer": self.startQuestTimer("timer2", 2000, npc, None) else: self.startQuestTimer("timer", 2000, npc, None) return
def onAdvEvent(self, event, npc, player): def getWorldFromInstanceId(): try: instanceid = int(event.split()[1]) except: print "invaild instance id %s" % event return None world = self.getWorld(instanceId=instanceid) if not world: print "Instance disappear %d" % instanceid return None return world if event.startswith("flowControl "): try: instanceid = int(event.split()[1]) except: print "flowControl error %s" % event return world = self.getWorld(instanceId=instanceid) if not world: self.cancelQuestTimer("flowControl %d" % instanceid, None, None) print "副本已消失 %d" % instanceid return i = InstanceManager.getInstance().getInstance(world.instanceId) for pid in i.getPlayers().toArray(): p = L2World.getInstance().getPlayer(pid) if p and p.getInstanceId() == world.instanceId: pass else: i.ejectPlayer(pid) i.removePlayer(pid) if i.getPlayers().isEmpty(): print "副本沒有玩家 %d" % world.instanceId self.cancelQuestTimer("flowControl %d" % instanceid, None, None) return return self.flowControl(world) if event == 'reentry': st = player.getQuestState(self.qn) instanceId = st.getInt('instanceId') self.teleport(player, instanceId) self.startQuestTimer("flowControl %d" % instanceId, 1000, None, None, True) if event == 'go': members = [player] if player.getParty(): if player.getParty().getCommandChannel(): if player.getParty().getCommandChannel().getLeader( ).getObjectId() != player.getObjectId(): return self.htm_header + self.htm_not_allow + self.htm_footer members = player.getParty().getCommandChannel().getMembers( ) else: if player.getParty().getLeader().getObjectId( ) != player.getObjectId(): return self.htm_header + self.htm_not_allow + self.htm_footer members = player.getParty().getMembers() #檢測所有隊員進入需求 r = "" for m in [x for x in members if not self.checkAllow(player, x)]: r += "%s<br1>" % m.getName() if len(r): return self.htm_header + self.htm_not_allow_member + r + self.htm_footer #創建副本 im = InstanceManager.getInstance() instanceid = im.createDynamicInstance(None) if instanceid: instance = im.getInstance(instanceid) world = MyInstanceWorld() world.instanceId = instanceid im.addWorld(world) instance.setDuration(self.instanceTime) instance.setEmptyDestroyTime(1000 * 60 * 1) instance.setSpawnLoc(self.ejectLoc) instance.setName("%s %s" % (self.qn, player.getName())) for p in members: self.takeItems(p, self.require_item_id, self.require_item_count) pid = p.getObjectId() world.allowed.add(pid) InstanceManager.getInstance().setInstanceTime( pid, self.InstanceTemplateId, System.currentTimeMillis() + self.InstanceReenterTime) self.teleport(p, instanceid) self.broadcastScreenMessage(world.instanceId, "準備") world.stage, world.step = 0, 1 #world.stage, world.step = 3, 0 self.startQuestTimer("flowControl %d" % world.instanceId, 1000, None, None, True) self.broadcastTimer(world.instanceId, self.timetos1s0 / 1000, "準備時間") self.startQuestTimer("s1s0 %d" % world.instanceId, self.timetos1s0, None, None, False) print "%s 創建副本 ID %d" % (player.getName(), world.instanceId) else: print "%s Error:can not create dynamic instance" % self.qn return #刷兔子 if event.startswith('s1s0 '): world = getWorldFromInstanceId() if not world: return if world.stage == 0 and world.step == 1: world.stage, world.step = 1, 0 self.broadcastScreenMessage(world.instanceId, "第一階段") cx, cy, cz = self.entryLoc for r, s in [(500, 10), (900, 20), (1300, 30)]: for x, y in self.plotCircle(cx, cy, r, s): npc = self.spawnNpc(self.wave1mobid, x, y, cz, 0, world.instanceId) self.startQuestTimer("s1s2 %d" % world.instanceId, self.timetos1s2, None, None, False) return #兔子主動攻擊 if event.startswith('s1s2 '): world = getWorldFromInstanceId() if not world: return if world.stage == 1 and world.step == 0: world.stage, world.step = 1, 2 self.broadcastScreenMessage(world.instanceId, "兄弟們 上啊") return #刷保護怪 #if event.startswith('s2s0 '): # world = getWorldFromInstanceId() # if not world: # return # if world.stage == 1 and world.step == 3: # world.stage, world.step = 2, 0 # world.flagInstance += [self.spawnNpc(self.wave2flagid, 84516, -16753, -1829, 0, world.instanceId)] # world.flagInstance += [self.spawnNpc(self.wave2flagid, 81651, -15373, -1832, 0, world.instanceId)] # return if event == 'exit': world = self.getWorld(player) if world: self.playerExit(world.instanceId, player.getObjectId())
def flowControl(self, world): if not isinstance(world, MyInstanceWorld): return if world.stage == 1: if world.step == 2: allnpc = self.getAllVisibleNpcs(world) for n in allnpc: p = self.getRandomPlayer(world) self.addHate(world, n, p) if world.wave1killed >= self.killcounttos2s0: world.stage, world.step = 2, 0 world.flagInstance += [ self.spawnNpc(self.wave2flagid, 84516, -16753, -1829, 0, world.instanceId) ] world.flagInstance += [ self.spawnNpc(self.wave2flagid, 81651, -15373, -1832, 0, world.instanceId) ] #self.startQuestTimer("s2s0 %d" % world.instanceId, 1000 * 5, None, None, False) self.broadcastScreenMessage( world.instanceId, "請保護 %s 不要被殺" % world.flagInstance[0].getName()) return if world.stage == 2: if world.step == 0: allnpc = self.getAllVisibleNpcs(world) for n in allnpc: p = None if n.getNpcId() == self.wave1mobid: p = self.getRandomFlag(world) if n.getNpcId() in [self.wave2mobid, self.wave2flagid]: p = self.getRandomPlayer(world) if p: self.addHate(world, n, p) for n in world.flagInstance: if not L2World.getInstance().findObject(n.getObjectId()): self.broadcastMessage(world.instanceId, "%s 死亡 副本失敗" % n.getName()) self.broadcastScreenMessage(world.instanceId, "%s 死亡 副本失敗" % n.getName()) world.allowed.clear() self.removeAllPlayers(world.instanceId) if len(allnpc) == 2: world.stage, world.step = 3, 0 return if world.stage == 3: if world.step == 0: for n in world.flagInstance: if n: i = InstanceManager.getInstance().getInstance( world.instanceId) if i: i.removeNpc(n) n.deleteMe() x, y, z = self.entryLoc world.bossInstance = self.spawnNpc(self.bossid, x, y, z, 0, world.instanceId) self.broadcastScreenMessage(world.instanceId, "最後階段") world.stage, world.step = 3, 1 if world.step == 1: b = world.bossInstance if b.getCurrentHp() / b.getMaxHp() < 0.9: world.stage, world.step = 3, 2 x, y, z = self.entryLoc world.runningInstance = self.spawnNpc( 29191, x, y, z, 0, world.instanceId) world.runningInstance.setRunning() world.runningInstance.setIsInvul(True) if world.step == 2: x, y, z = world.bossInstance.getX(), world.bossInstance.getY( ), world.bossInstance.getZ() r = self.plotCircle(x, y, self.runningR, self.runningStep) if r and len(r): world.runningIndex += 1 if world.runningIndex >= self.runningStep: world.runningIndex = 0 x, y = r[world.runningIndex] world.runningInstance.getAI().setIntention( CtrlIntention.AI_INTENTION_MOVE_TO, L2CharPosition(x, y, z, 0)) if world.stage == 4: if world.step == 0: i = InstanceManager.getInstance().getInstance(world.instanceId) if i: i.removeNpc(world.runningInstance) world.runningInstance.deleteMe()
def removeAllPlayers(self, instanceId): i = InstanceManager.getInstance().getInstance(instanceId) if i: for pid in i.getPlayers().toArray(): i.ejectPlayer(pid) i.removePlayer(pid)
def broadcastTimer(self, instanceId, time, text): for objId in InstanceManager.getInstance().getWorld( instanceId).allowed: p = L2World.getInstance().getPlayer(objId) p.sendPacket(ExSendUIEvent(p, False, False, time, 0, text))
def exitInstance(self, npc) : if self.worlds.has_key(npc.getInstanceId()): world = self.worlds[npc.getInstanceId()] instanceObj = InstanceManager.getInstance().getInstance(self.currentWorld) instanceObj.setDuration(60000) instanceObj.removeNpcs()
def playerExit(self, instanceId, playerId): i = InstanceManager.getInstance().getInstance(instanceId) if i: i.ejectPlayer(playerId) i.removePlayer(playerId)
def enterInstance(self, player, template, teleto): instanceId = 0 if not checkEnter(self, player) : return 0 party = player.getParty() #check for other instances of party members if party : for partyMember in party.getPartyMembers().toArray(): st = partyMember.getQuestState(qn) if st : id = st.getState() if not id == State.STARTED : player.sendPacket(SystemMessage.sendString(partyMember.getName() + "隊伍成員沒有進行任務。")) return 0 else : player.sendPacket(SystemMessage.sendString(partyMember.getName() + "隊伍成員沒有進行任務。")) return 0 if partyMember.getInstanceId() != 0: instanceId = partyMember.getInstanceId() if debug: print "Rim Pailaka: found party member in instance:" + str(instanceId) else : if player.getInstanceId() != 0: instanceId = player.getInstanceId() #exising instance if instanceId != 0: if not checkConditions(player, False): return 0 foundworld = False for worldid in self.world_ids: if worldid == instanceId: foundworld = True if not foundworld: player.sendPacket(SystemMessage.sendString("你的隊員已進入其它的即時地區。")) return 0 teleto.instanceId = instanceId teleportplayer(self, player, teleto) return instanceId #new instance else: if not checkConditions(player, True): return 0 instanceId = InstanceManager.getInstance().createDynamicInstance(template) if not instanceId in self.world_ids: world = PyObject() world.rewarded = [] world.instanceId = instanceId self.worlds[instanceId] = world self.world_ids.append(instanceId) self.currentWorld = instanceId print "Rim Pailaka: started. " + template + " Instance: " + str(instanceId) + " created by player: " + str(player.getName()) self.saveGlobalQuestVar("511_NextEnter", str(System.currentTimeMillis() + 14400000)) raidid = 1 spawnRaid(self, world, raidid) #teleports player teleto.instanceId = instanceId for partyMember in party.getPartyMembers().toArray(): st = partyMember.getQuestState(qn) st.set("cond", "1") playerName = partyMember.getName() teleportplayer(self, partyMember, teleto) return instanceId return instanceId
def onAdvEvent(self,event,npc,player): htmltext = event st = player.getQuestState(qn) if not st: return if event == "32498-03.htm": if player.getLevel() < 61: htmltext = "32498-01.htm" elif player.getLevel() >= 67: htmltext = "32498-00.htm" elif event == "32498-06.htm": st.set("cond","1") st.setState(State.STARTED) st.playSound("ItemSound.quest_accept") elif event == "accept": tele = PyObject() tele.x = 76438 tele.y = -219035 tele.z = -3752 enterInstance(self, player, "PailakaDevilsLegacy.xml", tele, self) htmltext = "32498-08.htm" st.playSound("ItemSound.quest_accept") st.set("cond","2") elif event == "accept1": tele = PyObject() tele.x = 76438 tele.y = -219035 tele.z = -3752 enterInstance(self, player, "PailakaDevilsLegacy.xml", tele, self) htmltext = "32498-10.htm" elif event == "32501-05.htm": st.set("cond","2") st.playSound("ItemSound.quest_middle") elif event == "32501-03.htm": st.playSound("ItemSound.quest_middle") st.giveItems(ANCIENT_LEGACY_SWORD, 1) st.set("cond","3") elif event == "1": pet = player.getPet() if pet != None : htmltext = "32508-03.htm" else: if self.Lock == 0: if st.getQuestItemsCount(ANCIENT_LEGACY_SWORD) == 1 and st.getQuestItemsCount(PAILAKA_WEAPON_UPGRADE_STAGE_1) == 1: st.playSound("ItemSound.quest_itemget") st.takeItems(ANCIENT_LEGACY_SWORD, -1) st.takeItems(PAILAKA_WEAPON_UPGRADE_STAGE_1, -1) st.giveItems(ENHANCED_ANCIENT_LEGACY_SWORD, 1) htmltext = "32508-01.htm" self.Lock = 1 else : htmltext = "32508-02.htm" elif self.Lock == 1: if st.getQuestItemsCount(ENHANCED_ANCIENT_LEGACY_SWORD) == 1 and st.getQuestItemsCount(PAILAKA_WEAPON_UPGRADE_STAGE_2) == 1: st.playSound("ItemSound.quest_itemget") st.takeItems(ENHANCED_ANCIENT_LEGACY_SWORD, -1) st.takeItems(PAILAKA_WEAPON_UPGRADE_STAGE_2, -1) st.giveItems(COMPLETE_ANCIENT_LEGACY_SWORD, 1) htmltext = "32508-04.htm" self.Lock = 2 else : htmltext = "32508-02.htm" elif self.Lock == 2: if st.getQuestItemsCount(COMPLETE_ANCIENT_LEGACY_SWORD) == 1: htmltext = "32508-05.htm" elif event == "32511-01.htm": pet = player.getPet() if pet != None: htmltext = "32511-03.htm" else: st.playSound("ItemSound.quest_finish") st.giveItems(PSOE, 1) st.giveItems(PAILAKA_BRACELET, 1) player.setVitalityPoints(20000, True) st.addExpAndSp(10800000, 950000) st.exitQuest(False) instanceId = player.getInstanceId() instance = InstanceManager.getInstance().getInstance(instanceId) instance.setDuration(300000) return htmltext