Jump to content

Question

Posted

Hi!

 

I hope somebody can help on my problem. (H5 with .py files)

 

I have a party instance (bloodshed). I want to put a boss to end of instance. Everything work fine. But the players not get reenter time to instance.

I have a solo instance and there work fine the reenter timer. I tried copy the code from that instance but i got many error. 

 

This is the code of party instance (without reenter timer):

#Instance Event by Bloodshed
from com.l2jserver.gameserver.instancemanager        import InstanceManager
from com.l2jserver.gameserver.model.items.instance   import L2ItemInstance
from com.l2jserver.gameserver.model.actor            import L2Summon
from com.l2jserver.gameserver.model.entity           import Instance
from com.l2jserver.gameserver.model.itemcontainer    import PcInventory
from com.l2jserver.gameserver.model.quest            import State
from com.l2jserver.gameserver.model.quest            import QuestState
from com.l2jserver.gameserver.model.quest.jython     import QuestJython as JQuest
from com.l2jserver.gameserver.network.serverpackets  import CreatureSay
from com.l2jserver.gameserver.network.serverpackets  import InventoryUpdate
from com.l2jserver.gameserver.network.serverpackets  import MagicSkillUse
from com.l2jserver.gameserver.network.serverpackets  import SystemMessage
from com.l2jserver.gameserver.network.serverpackets  import ExShowScreenMessage
from com.l2jserver.gameserver.network.serverpackets  import Earthquake
from com.l2jserver.gameserver.network                import SystemMessageId
from com.l2jserver.gameserver.util                   import Util
from com.l2jserver.util                              import Rnd

qn = "Bloodshed"

#Items
E_APIGA	= 14720
ADENA	= 57
STONE	= 9576
STONE82	= 10486
STONE84	= 14169
SCROLL	= 960
SCROLLB	= 6577

#NPCs
ROSE	= 40000
CHEST	= 40001

#Monsters
NAGLFAR	= 40002
SENTRY1	= 40003
SENTRY2	= 40004
HOUND	= 40005

#Timelimit
TIMELIMIT = 86400000

#Instance Id
INSTANCEID = 161

#Doors
DOOR1	= 12240001
DOOR2	= 12240002

class PyObject:
	pass

def openDoor(doorId,instanceId):
	for door in InstanceManager.getInstance().getInstance(instanceId).getDoors():
		if door.getDoorId() == doorId:
			door.openMe()
			
def closeDoor(doorId,instanceId):
	for door in InstanceManager.getInstance().getInstance(instanceId).getDoors():
		if door.getDoorId() == doorId:
			door.closeMe()
			
def checkConditions(player, new):
	party = player.getParty()
	if not party:
		player.sendPacket(SystemMessage.sendString("You are not currently in a party, so you cannot enter."))
		return False
	if party and party.getMemberCount() < 2:
		player.sendPacket(SystemMessage.sendString("You cannot enter because there is too less people in your party. Minimum is 4 people."))
		return False
	for partyMember in party.getMembers().toArray():
		if partyMember.getLevel() < 78:
			player.sendPacket(SystemMessage.sendString(partyMember.getName()+"s level is too low and cannot be entered."))
			return False  
		if not Util.checkIfInRange(1000, player, partyMember, True) and new:
			player.sendPacket(SystemMessage.sendString(partyMember.getName()+" is too far away ask him to come here."))
			return False
	return True

def teleportplayer(self,player,teleto):
	player.setInstanceId(teleto.instanceId)
	player.teleToLocation(teleto.x, teleto.y, teleto.z)
	pet = player.getSummon()
	if pet != None :
		pet.setInstanceId(teleto.instanceId)
		pet.teleToLocation(teleto.x, teleto.y, teleto.z)
	return

def enterInstance(self,player,template,teleto):
	instanceId = 0
	party = player.getParty()
	if party :
		for partyMember in party.getMembers().toArray():
			st = partyMember.getQuestState(qn)
			if not st : st = self.newQuestState(partyMember)
			if partyMember.getInstanceId()!=0:
				instanceId = partyMember.getInstanceId()
	else :
		if player.getInstanceId()!=0:
			instanceId = player.getInstanceId()
	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("You have entered another zone, therefore you cannot enter this one."))
			return 0
		teleto.instanceId = instanceId
		teleportplayer(self,player,teleto)
		return instanceId
	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)
			print "Instance: Started " + template + " Instance: " +str(instanceId) + " created by " + str(player.getName())
		teleto.instanceId = instanceId
		for partyMember in party.getMembers().toArray():
			teleportplayer(self,partyMember,teleto)
		return instanceId
	return instanceId

def exitInstance(player,tele):
	party = player.getParty()
	if party :
		for partyMember in party.getMembers().toArray():
			partyMember.setInstanceId(0)
			partyMember.teleToLocation(tele.x, tele.y, tele.z)
			pet = partyMember.getSummon()
			if pet != None :
				pet.setInstanceId(0)
				pet.teleToLocation(tele.x, tele.y, tele.z)
	else :
		player.setInstanceId(0)
		player.teleToLocation(tele.x, tele.y, tele.z)
		pet = player.getSummon()
		if pet != None :
			pet.setInstanceId(0)
			pet.teleToLocation(tele.x, tele.y, tele.z)
	InstanceManager.getInstance().destroyInstance(player.getInstanceId())

class Bloodshed(JQuest):
	def __init__(self,id,name,descr):
		JQuest.__init__(self,id,name,descr)
		self.worlds = {}
		self.world_ids = []
		
	def onTalk (self,npc,player):
		st = player.getQuestState(qn)
		npcId = npc.getNpcId()
		if npcId == ROSE :
			tele = PyObject()
			tele.x = -238599
			tele.y = 219983
			tele.z = -10144
			enterInstance(self, player, "Bloodshed.xml", tele)
#			st.playSound("ItemSound.quest_middle")
		elif npcId == CHEST :
			npc.decayMe()
			tele = PyObject()
			tele.x = 82200
			tele.y = 148347
			tele.z = -3467
			party = player.getParty()
			if party :
				for partyMember in party.getMembers().toArray():
					exitInstance(partyMember,tele)

			else:
				exitInstance(player,tele)
			st.giveItems(ADENA,10000)
			if Rnd.get(100) < 10 :
				st.giveItems(STONE84,1)
			if Rnd.get(100) < 15 :
				st.giveItems(STONE82,1)
			if Rnd.get(100) < 25 :
				st.giveItems(STONE,1)
			if Rnd.get(100) < 25 :
				st.giveItems(SCROLLB,1)
			if Rnd.get(100) < 50 :
				st.giveItems(SCROLL,1)
			st.playSound("ItemSound.quest_finish")
			player.sendPacket(ExShowScreenMessage("Solo Instance Event (78+): Completed", 8000))
		return
		
	def onKill(self,npc,player,isPet):
		st = player.getQuestState(qn)
		npcId = npc.getNpcId()
		if npcId == SENTRY1 :
			if npc.getInstanceId() in self.worlds:
				world = self.worlds[npc.getInstanceId()]
				st.playSound("ItemSound.quest_middle")
				player.sendPacket(CreatureSay(npc.getObjectId(), 0, npc.getName(), "Master, Forgive Me!"))
				st.giveItems(E_APIGA,1)
				openDoor(DOOR1,npc.instanceId)
		elif npcId == SENTRY2 :
			if npc.getInstanceId() in self.worlds:
				world = self.worlds[npc.getInstanceId()]
				st.playSound("ItemSound.quest_middle")
				player.sendPacket(CreatureSay(npc.getObjectId(), 0, npc.getName(), "Master, Forgive Me!"))
				st.giveItems(E_APIGA,1)
				openDoor(DOOR2,npc.instanceId)
		elif npcId == HOUND :
			if npc.getInstanceId() in self.worlds:
				world = self.worlds[npc.getInstanceId()]
				st.playSound("ItemSound.quest_middle")
				st.giveItems(E_APIGA,2)
				player.sendPacket(ExShowScreenMessage("Demonic Lord Naglfar Has Appeared!", 8000))
				newNpc = self.addSpawn(NAGLFAR,-242754,219982,-9985,306,False,0,False,npc.instanceId)
				player.sendPacket(Earthquake(240826,219982,-9985,20,10))
		elif npcId == NAGLFAR :
			if npc.getInstanceId() in self.worlds:
				world = self.worlds[npc.getInstanceId()]
				player.sendPacket(CreatureSay(npc.getObjectId(), 0, npc.getName(), "Ugh.... Defeated.. How!?"))
				player.sendPacket(ExShowScreenMessage("Congratulations! You Have Defeated Demonic Lord Naglfar.", 12000))
				st.playSound("ItemSound.quest_finish")
				st.giveItems(E_APIGA,4)
				newNpc = self.addSpawn(CHEST,-242754,219982,-9985,306,False,0,False,npc.instanceId)
		return

QUEST = Bloodshed(-1, qn, "Bloodshed")
QUEST.addStartNpc(ROSE)
QUEST.addTalkId(ROSE)
QUEST.addTalkId(CHEST)

QUEST.addKillId(NAGLFAR)
QUEST.addKillId(HOUND)
QUEST.addKillId(SENTRY1)
QUEST.addKillId(SENTRY2)

This is the solo instance with working timer:

#Instance Engine by Bloodshed, Fixed by Sakretsu

from java.lang                                                 import System
from java.sql                                                  import Connection
from java.sql                                                  import PreparedStatement
from java.sql                                                  import ResultSet
from java.util.logging                                         import Level
from java.util.logging                                         import Logger

from com.l2jserver                                             import L2DatabaseFactory
from com.l2jserver.gameserver.instancemanager                  import InstanceManager
from com.l2jserver.gameserver.model.instancezone               import InstanceWorld
from com.l2jserver.gameserver.model.items.instance             import L2ItemInstance
from com.l2jserver.gameserver.model                            import L2Object
from com.l2jserver.gameserver.model                            import L2World
from com.l2jserver.gameserver.model.actor                      import L2Character
from com.l2jserver.gameserver.model.actor                      import L2Summon
from com.l2jserver.gameserver.model.entity                     import Instance
from com.l2jserver.gameserver.model.itemcontainer              import PcInventory
from com.l2jserver.gameserver.model.quest                      import State
from com.l2jserver.gameserver.model.quest                      import QuestState
from com.l2jserver.gameserver.model.quest.jython               import QuestJython as JQuest
from com.l2jserver.gameserver.network.serverpackets            import CreatureSay
from com.l2jserver.gameserver.network.serverpackets            import InventoryUpdate
from com.l2jserver.gameserver.network.serverpackets            import MagicSkillUse
from com.l2jserver.gameserver.network.serverpackets            import SystemMessage
from com.l2jserver.gameserver.network.serverpackets            import ExShowScreenMessage
from com.l2jserver.gameserver.network.serverpackets            import Earthquake
from com.l2jserver.gameserver.network                          import SystemMessageId
from com.l2jserver.gameserver.util                             import Util
from com.l2jserver.util                                        import Rnd

qn = "Bloodshed"

#Items
E_APIGA	= 14721
ADENA	= 57
STONE	= 16167
SCROLL	= 960

#NPCs
ROSE	= 40000
CHEST	= 40001

#Monsters
NAGLFAR	= 40002
SENTRY1	= 40003
SENTRY2	= 40004
HOUND	= 40005

#Timelimit
TIMELIMIT = 86400000

#Instance Id
INSTANCEID = 500000

#Doors
DOOR1	= 12240001
DOOR2	= 12240002

class PyObject:
	pass

def openDoor(doorId,instanceId):
	for door in InstanceManager.getInstance().getInstance(instanceId).getDoors():
		if door.getDoorId() == doorId:
			door.openMe()
			
def closeDoor(doorId,instanceId):
	for door in InstanceManager.getInstance().getInstance(instanceId).getDoors():
		if door.getDoorId() == doorId:
			door.closeMe()
			
def checkConditions(player, new):
	st = player.getQuestState(qn)
	reentertime = InstanceManager.getInstance().getInstanceTime(player.getObjectId(), INSTANCEID);
	party = player.getParty()
	if party:
		player.sendPacket(SystemMessage.sendString("You may not enter with a party."))
		return False
	if not player.getLevel() >= 83:
		player.sendPacket(SystemMessage.sendString("You must be level 83 or higher to enter."))
		return False
	if System.currentTimeMillis() < reentertime :
		InstanceManager.getInstance().getInstanceTime(player.getObjectId(), INSTANCEID)
		player.sendPacket(SystemMessage.sendString("Solo Instance: You may not re-enter yet."))
		return False
	if not party:
		return True
	return False

def teleportplayer(self,player,teleto):
	player.setInstanceId(teleto.instanceId)
	player.teleToLocation(teleto.x, teleto.y, teleto.z)
	pet = player.getSummon()
	if pet != None :
		pet.setInstanceId(teleto.instanceId)
		pet.teleToLocation(teleto.x, teleto.y, teleto.z)
	return

def enterInstance(self,player,template,teleto):
	instanceId = 0
	party = player.getParty()
	if party :
		for partyMember in party.getPartyMembers().toArray():
			st = partyMember.getQuestState(qn)
			if not st : st = self.newQuestState(partyMember)
			if partyMember.getInstanceId()!=0:
				instanceId = partyMember.getInstanceId()
	else :
		if player.getInstanceId()!=0:
			instanceId = player.getInstanceId()
	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("You have entered another zone, therefore you cannot enter this one."))
			return 0
		teleto.instanceId = instanceId
		teleportplayer(self,player,teleto)
		return instanceId
	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
			world.templateId = INSTANCEID
			self.worlds[instanceId]=world
			self.world_ids.append(instanceId)
			print "Instance Bloodshed.xml Started: " +str(instanceId) + " created by " + str(player.getName())
		st = player.getQuestState(qn)
		InstanceManager.getInstance().setInstanceTime(player.getObjectId(), INSTANCEID, ((System.currentTimeMillis() + TIMELIMIT)))
		teleto.instanceId = instanceId
		teleportplayer(self,player,teleto)
		return instanceId
	return instanceId

def exitInstance(player,tele):
	player.setInstanceId(0)
	player.teleToLocation(tele.x, tele.y, tele.z)
	pet = player.getSummon()
	if pet != None :
		pet.setInstanceId(0)
		pet.teleToLocation(tele.x, tele.y, tele.z)

class Bloodshed(JQuest):
	def __init__(self,id,name,descr):
		JQuest.__init__(self,id,name,descr)
		self.worlds = {}
		self.world_ids = []
		
	def onTalk (self,npc,player):
		st = player.getQuestState(qn)
		npcId = npc.getNpcId()
		if npcId == ROSE :
			tele = PyObject()
			tele.x = -238599
			tele.y = 219983
			tele.z = -10144
			enterInstance(self, player, "Bloodshed.xml", tele)
			st.playSound("ItemSound.quest_middle")
		elif npcId == CHEST :
			npc.decayMe()
			tele = PyObject()
			tele.x = 83279
			tele.y = 148011
			tele.z = -3404
			exitInstance(player,tele)
			st.giveItems(ADENA,5000000)
			st.giveItems(STONE,1)
			st.giveItems(SCROLL,2)
			st.playSound("ItemSound.quest_finish")
			player.sendPacket(ExShowScreenMessage("Solo Instance Event (83+): Completed", 8000))
		return
		
	def onKill(self,npc,player,isPet):
		st = player.getQuestState(qn)
		npcId = npc.getNpcId()
		if npcId == SENTRY1 :
			if npc.getInstanceId() in self.worlds:
				world = self.worlds[npc.getInstanceId()]
				st.playSound("ItemSound.quest_middle")
				player.sendPacket(CreatureSay(npc.getObjectId(), 0, npc.getName(), "Master, Forgive Me!"))
				st.giveItems(E_APIGA,2)
				openDoor(DOOR1,npc.instanceId)
		elif npcId == SENTRY2 :
			if npc.getInstanceId() in self.worlds:
				world = self.worlds[npc.getInstanceId()]
				st.playSound("ItemSound.quest_middle")
				player.sendPacket(CreatureSay(npc.getObjectId(), 0, npc.getName(), "Master, Forgive Me!"))
				st.giveItems(E_APIGA,2)
				openDoor(DOOR2,npc.instanceId)
		elif npcId == HOUND :
			if npc.getInstanceId() in self.worlds:
				world = self.worlds[npc.getInstanceId()]
				st.playSound("ItemSound.quest_middle")
				st.giveItems(E_APIGA,3)
				player.sendPacket(ExShowScreenMessage("Demonic Lord Naglfar Has Appeared!", 8000))
				newNpc = self.addSpawn(NAGLFAR,-242754,219982,-9985,306,False,0,False,npc.instanceId)
				player.sendPacket(Earthquake(240826,219982,-9985,20,10))
		elif npcId == NAGLFAR :
			if npc.getInstanceId() in self.worlds:
				world = self.worlds[npc.getInstanceId()]
				player.sendPacket(CreatureSay(npc.getObjectId(), 0, npc.getName(), "Ugh.... Defeated.. How!?"))
				player.sendPacket(ExShowScreenMessage("Congratulations! You Have Defeated Demonic Lord Naglfar.", 12000))
				st.playSound("ItemSound.quest_fanfare_2")
				st.giveItems(E_APIGA,4)
				newNpc = self.addSpawn(CHEST,-242754,219982,-9985,306,False,0,False,npc.instanceId)
		return

QUEST = Bloodshed(-1, qn, "Bloodshed")
QUEST.addStartNpc(ROSE)
QUEST.addTalkId(ROSE)
QUEST.addTalkId(CHEST)

QUEST.addKillId(NAGLFAR)
QUEST.addKillId(HOUND)
QUEST.addKillId(SENTRY1)
QUEST.addKillId(SENTRY2)

Please somebody help on me. 

 

Recommended Posts

Guest
This topic is now closed to further replies.


×
×
  • Create New...