Jump to content
  • 0

[Help] Instance Script !


Question

Posted

Hello Guys

I have that instance script. is for a party of 2 players that can enter here. kill some monsters and take a reward from a chest.

 

Here is the script code:

 

#Instance Event by Bloodshed
from com.l2jserver.gameserver.instancemanager        import InstanceManager
from com.l2jserver.gameserver.model                  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	= 2009001
CHEST	= 2009002

#Monsters
NAGLFAR	= 2009010
SENTRY1	= 2009011
SENTRY2	= 2009012
HOUND	= 2009013

#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.getPartyMembers().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.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
	for partyMember in party.getPartyMembers().toArray():
		teleportplayer(self,partyMember,teleto)
	return instanceId
return instanceId

def exitInstance(player,tele):
party = player.getParty()
if party :
	for partyMember in party.getPartyMembers().toArray():
		partyMember.setInstanceId(0)
		partyMember.teleToLocation(tele.x, tele.y, tele.z)
		pet = partyMember.getPet()
		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.getPet()
	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.getPartyMembers().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)

 

I want To Edit that script and make that changes:

1) Any player can enter withount 2nd player or party..(Solo instance)

2) A cooldown at the enter of the instance. ( if someone enter he cant enter again today. 24hours Re-use)

 

If someone can help me.. Thanks in advance!!!

1 answer to this question

Recommended Posts

  • 0
Posted

 

1) Any player can enter withount 2nd player or party..(Solo instance)

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.getPartyMembers().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

change that to only check if (player.getLevel < 78)

 

for the second one i have no idea of how to do that, search for some other instances (if you find any in python) and just c/p that

 

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Posts

    • There is a ready-made option and the possibility to work according to "Wishlist"
    • Contact me, Discord: xbaus
    • WTB GRACIA FINAL INTERFACE
    • Dear partners! At the moment we are in great need of the following positions: — Snapchat old and new accounts | With snapscores | Geo: Europe/USA | Full access via email/phone number — Reddit old (brute or hacked origin, self-registered) accounts with post and comment karma from 100 to 100,000+ | Full email access included — LinkedIn old accounts with real connections | Geo: Europe/USA | Full email access + active 2FA password — Instagram old accounts (2010–2023) | Full email access (possibly with active 2FA password) — Facebook old accounts (2010–2023) | Full email access (possibly with active 2FA password) | With friends or without friends | Geo: Europe/USA/Asia — Threads accounts | Full email access (possibly with active 2FA password) — TikTok/Facebook/Google ADS Agency advertising accounts — Email accounts: mail.ru, yahoo.com, gazeta.pl, gmx.ch / gmx.de / gmx.net (BUT NOT gmx.com) — Google ADS Manual Farm accounts (verified via email and phone number) | GEO: USA/Europe, mostly USA. — WhatsApp OLD Accounts — Twitter accounts with followers and posts (old accounts) Contact us via the details below. We will be glad to cooperate! We are also ready to consider other partnership and collaboration options. Active links to our projects: Digital goods store (Website): Go to Store Telegram bot: Go to – convenient access to the store via the Telegram messenger. Virtual numbers service: Go to Telegram bot for purchasing Telegram Stars: Go to – fast and profitable purchase of Stars in Telegram. SMM Panel: Go to – promotion of your social media accounts. Contacts and support: ➡ Telegram: https://t.me/socnet_support ➡ WhatsApp: https://wa.me/79051904467 ➡ Discord: socnet_support ➡ ✉ Email: solomonbog@socnet.store
  • Topics

×
×
  • Create New...

AdBlock Extension Detected!

Our website is made possible by displaying online advertisements to our members.

Please disable AdBlock browser extension first, to be able to use our community.

I've Disabled AdBlock