Page 1 of 1

Adding entrance per day restriction to solo event.

Posted: Thu May 20, 2010 11:27 am
by hiroshima
If you want to receive support we need this info to help you properly.
» Find Revision
L2J Revision 4205:
L2JDP Revision 7415:

Hello i`d like to add restriction which wont allow players to enter Solo Event if they was once there already (1 event per day).

Code: Select all

#Instance Event by Bloodshedfrom com.l2jserver.gameserver.instancemanager        import InstanceManagerfrom com.l2jserver.gameserver.model                  import L2ItemInstancefrom com.l2jserver.gameserver.model.actor            import L2Summonfrom com.l2jserver.gameserver.model.entity           import Instancefrom com.l2jserver.gameserver.model.itemcontainer    import PcInventoryfrom com.l2jserver.gameserver.model.quest            import Statefrom com.l2jserver.gameserver.model.quest            import QuestStatefrom com.l2jserver.gameserver.model.quest.jython     import QuestJython as JQuestfrom com.l2jserver.gameserver.network.serverpackets  import CreatureSayfrom com.l2jserver.gameserver.network.serverpackets  import InventoryUpdatefrom com.l2jserver.gameserver.network.serverpackets  import MagicSkillUsefrom com.l2jserver.gameserver.network.serverpackets  import SystemMessagefrom com.l2jserver.gameserver.network.serverpackets  import ExShowScreenMessagefrom com.l2jserver.gameserver.network.serverpackets  import Earthquakefrom com.l2jserver.gameserver.network                import SystemMessageIdfrom com.l2jserver.gameserver.util                   import Utilfrom com.l2jserver.util                              import Rnd qn = "Bloodshed" #ItemsE_APIGA	= 14720ADENA	= 57STONE	= 9576SCROLL	= 960 #NPCsROSE	= 2009001CHEST	= 2009002 #MonstersNAGLFAR	= 2009010SENTRY1	= 2009011SENTRY2	= 2009012HOUND	= 2009013 #DoorsDOOR1	= 12240001DOOR2	= 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 party:		player.sendPacket(SystemMessage.sendString("You may not enter with a party."))		return False	if not player.getLevel() >= 78:		player.sendPacket(SystemMessage.sendString("You must be level 78 or higher to enter."))		return False	if not party:		return True	return True def teleportplayer(self,player,teleto):	player.setInstanceId(teleto.instanceId)	player.teleToLocation(teleto.x, teleto.y, teleto.z)	pet = player.getPet()	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			self.worlds[instanceId]=world			self.world_ids.append(instanceId)			print "Instance: Started " + template + " Instance: " +str(instanceId) + " created by " + str(player.getName())		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.getPet()	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 = 82200			tele.y = 148347			tele.z = -3467			exitInstance(player,tele)			st.giveItems(ADENA,2750000)			st.giveItems(STONE,1)			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_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)
one more question, is there any working solution for Hellbound quest where u can get +81 armors? (even with multisells) which dont need core modifications?

Re: Adding entrance per day restriction to solo event.

Posted: Thu May 20, 2010 7:01 pm
by LasTravel
test this:

Code: Select all

#Instance Event by Bloodshedfrom com.l2jserver.gameserver.instancemanager        import InstanceManagerfrom com.l2jserver.gameserver.model                  import L2ItemInstancefrom com.l2jserver.gameserver.model.actor            import L2Summonfrom com.l2jserver.gameserver.model.entity           import Instancefrom com.l2jserver.gameserver.model.itemcontainer    import PcInventoryfrom com.l2jserver.gameserver.model.quest            import Statefrom com.l2jserver.gameserver.model.quest            import QuestStatefrom com.l2jserver.gameserver.model.quest.jython     import QuestJython as JQuestfrom com.l2jserver.gameserver.network.serverpackets  import CreatureSayfrom com.l2jserver.gameserver.network.serverpackets  import InventoryUpdatefrom com.l2jserver.gameserver.network.serverpackets  import MagicSkillUsefrom com.l2jserver.gameserver.network.serverpackets  import SystemMessagefrom com.l2jserver.gameserver.network.serverpackets  import ExShowScreenMessagefrom com.l2jserver.gameserver.network.serverpackets  import Earthquakefrom com.l2jserver.gameserver.network                import SystemMessageIdfrom com.l2jserver.gameserver.util                   import Utilfrom com.l2jserver.util                              import Rnd qn = "Bloodshed" #ItemsE_APIGA	= 14720ADENA	= 57STONE	= 9576SCROLL	= 960 #NPCsROSE	= 2009001CHEST	= 2009002 #MonstersNAGLFAR	= 2009010SENTRY1	= 2009011SENTRY2	= 2009012HOUND	= 2009013 #DoorsDOOR1	= 12240001DOOR2	= 12240002 #Instance respawn delay, time on msrespawn_delay = 86400000  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):	test = self.loadGlobalQuestVar("Bloodshed")	if test.isdigit() :		remain = long(test) - System.currentTimeMillis()	else :		remain = 0	party = player.getParty()	if party:		player.sendPacket(SystemMessage.sendString("You may not enter with a party."))		return False	if not player.getLevel() >= 78:		player.sendPacket(SystemMessage.sendString("You must be level 78 or higher to enter."))		return False	if not party:		return True	check spawn instance	if remain > 0 :		player.sendMessage("Bloodshed instance not ready.")		return 0	return True def teleportplayer(self,player,teleto):	player.setInstanceId(teleto.instanceId)	player.teleToLocation(teleto.x, teleto.y, teleto.z)	pet = player.getPet()	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			self.worlds[instanceId]=world			self.world_ids.append(instanceId)			print "Instance: Started " + template + " Instance: " +str(instanceId) + " created by " + str(player.getName())		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.getPet()	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 :			#set spawn instance			self.saveGlobalQuestVar("Bloodshed", str(System.currentTimeMillis()+respawn_delay))			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			exitInstance(player,tele)			st.giveItems(ADENA,2750000)			st.giveItems(STONE,1)			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_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)

Re: Adding entrance per day restriction to solo event.

Posted: Sat Nov 13, 2010 1:26 am
by darknessneo
someone can help me for fix it on freya?
i have a error with check spawn instance

Re: Adding entrance per day restriction to solo event.

Posted: Sat Nov 13, 2010 12:35 pm
by SolidSnake

Re: Adding entrance per day restriction to solo event.

Posted: Sat Nov 13, 2010 3:08 pm
by darknessneo
woops, dont have see, sorry, and very thx, works like a charm.