예제 #1
0
 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
예제 #2
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
예제 #3
0
파일: GBreset.py 프로젝트: w001122/s4L2J
	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)
예제 #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
예제 #5
0
 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
예제 #6
0
 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
예제 #7
0
파일: GBreset.py 프로젝트: w001122/s4L2J
	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
예제 #8
0
	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
예제 #9
0
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
예제 #10
0
	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
예제 #11
0
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
예제 #12
0
	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
예제 #13
0
	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
예제 #14
0
 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
예제 #15
0
 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
예제 #16
0
	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
예제 #17
0
 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
예제 #18
0
	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
예제 #19
0
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
예제 #20
0
 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
예제 #21
0
 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"
예제 #22
0
    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
예제 #23
0
 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
예제 #24
0
    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
예제 #25
0
    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())
예제 #26
0
    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()
예제 #27
0
 def removeAllPlayers(self, instanceId):
     i = InstanceManager.getInstance().getInstance(instanceId)
     if i:
         for pid in i.getPlayers().toArray():
             i.ejectPlayer(pid)
             i.removePlayer(pid)
예제 #28
0
 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))
예제 #29
0
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()
예제 #30
0
 def playerExit(self, instanceId, playerId):
     i = InstanceManager.getInstance().getInstance(instanceId)
     if i:
         i.ejectPlayer(playerId)
         i.removePlayer(playerId)
예제 #31
0
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
예제 #32
0
	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