Rio Posted January 18, 2015 Posted January 18, 2015 (edited) Hello guys i wonder if you can help me to restrict private store in whole Giran and allow them only in specific place example (im using l2jHellas): Edited January 18, 2015 by Rio
0 Tessa Posted January 19, 2015 Posted January 19, 2015 (edited) Well, I will guide you through the zone creation, but I will use a pack that I'm currently working on... so l2jhellas implementation might be little different. First you should create the zone: Index: java/net/sf/l2j/gameserver/model/zone/type/L2StoreZone.java =================================================================== --- java/net/sf/l2j/gameserver/model/zone/type/L2StoreZone.java (revision 0) +++ java/net/sf/l2j/gameserver/model/zone/type/L2StoreZone.java (working copy) @@ -0,0 +1,64 @@ +/* This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + * + * http://www.gnu.org/copyleft/gpl.html + */ +package net.sf.l2j.gameserver.model.zone.type; + +import net.sf.l2j.gameserver.model.L2Character; +import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance; +import net.sf.l2j.gameserver.model.zone.L2ZoneType; + +/** + * A scripted zone... + * Creation of such a zone should require somekind + * of jython script reference which can handle onEnter() / onExit() + * + * @author durgus + */ +public class L2StoreZone extends L2ZoneType +{ + public L2StoreZone(int id) + { + super(id); + } + + @Override + protected void onEnter(L2Character character) + { + if (character instanceof L2PcInstance) + { + character.setInsideZone(L2Character.ZONE_STORE, true); + ((L2PcInstance) character).sendMessage("You enter the private store zone!"); + } + } + + @Override + protected void onExit(L2Character character) + { + if (character instanceof L2PcInstance) + { + character.setInsideZone(L2Character.ZONE_STORE, false); + ((L2PcInstance) character).sendMessage("You left the private store zone!"); + } + } + + @Override + protected void onDieInside(L2Character character) {} + + @Override + protected void onReviveInside(L2Character character) {} + +} All of these methods SHOULD be here, because you extend the abstract class L2ZoneType which requires that. Then you should add the new zone in L2Character: Index: java/net/sf/l2j/gameserver/model/L2Character.java =================================================================== --- java/net/sf/l2j/gameserver/model/L2Character.java (revision 385) +++ java/net/sf/l2j/gameserver/model/L2Character.java (working copy) @@ -189,6 +189,7 @@ public static final int ZONE_WATER = 128; public static final int ZONE_JAIL = 256; public static final int ZONE_MONSTERTRACK = 512; + public static final int ZONE_STORE = 1024; private int _currentZones = 0; Currently I don't know how the zone system works, but it should be that way :lol: In my pack I have to load the zone that way: Index: java/net/sf/l2j/gameserver/datatables/ZoneData.java =================================================================== --- java/net/sf/l2j/gameserver/datatables/ZoneData.java (revision 385) +++ java/net/sf/l2j/gameserver/datatables/ZoneData.java (working copy) @@ -49,6 +49,7 @@ import net.sf.l2j.gameserver.model.zone.type.L2JailZone; import net.sf.l2j.gameserver.model.zone.type.L2MotherTreeZone; import net.sf.l2j.gameserver.model.zone.type.L2NoLandingZone; +import net.sf.l2j.gameserver.model.zone.type.L2StoreZone; import net.sf.l2j.gameserver.model.zone.type.L2OlympiadStadiumZone; import net.sf.l2j.gameserver.model.zone.type.L2PeaceZone; import net.sf.l2j.gameserver.model.zone.type.L2TownZone; @@ -171,6 +172,8 @@ temp = new L2BossZone(zoneId); else if (zoneType.equals("WaterZone")) temp = new L2WaterZone(zoneId); + else if (zoneType.equals("StoreZone")) + temp = new L2StoreZone(zoneId); // Check for unknown type I don't know if the zone should be registered in l2jhellas... Finally you should check if the player is inside the zone: Index: java/net/sf/l2j/gameserver/clientpackets/RequestPrivateStoreManageBuy.java =================================================================== --- java/net/sf/l2j/gameserver/clientpackets/RequestPrivateStoreManageBuy.java (revision 385) +++ java/net/sf/l2j/gameserver/clientpackets/RequestPrivateStoreManageBuy.java (working copy) @@ -18,7 +18,9 @@ */ package net.sf.l2j.gameserver.clientpackets; +import net.sf.l2j.gameserver.model.L2Character; import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance; +import net.sf.l2j.gameserver.serverpackets.ActionFailed; /** * This class ... @@ -42,6 +44,12 @@ L2PcInstance player = getClient().getActiveChar(); if (player != null) { + if (!player.isInsideZone(L2Character.ZONE_STORE)) + { + player.sendMessage("You cannot open a private store here!"); + sendPacket(ActionFailed.STATIC_PACKET); + return; + } player.tryOpenPrivateBuyStore(); } } Index: java/net/sf/l2j/gameserver/clientpackets/RequestPrivateStoreManageSell.java =================================================================== --- java/net/sf/l2j/gameserver/clientpackets/RequestPrivateStoreManageSell.java (revision 385) +++ java/net/sf/l2j/gameserver/clientpackets/RequestPrivateStoreManageSell.java (working copy) @@ -18,7 +18,9 @@ */ package net.sf.l2j.gameserver.clientpackets; +import net.sf.l2j.gameserver.model.L2Character; import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance; +import net.sf.l2j.gameserver.serverpackets.ActionFailed; /** * This class ... @@ -42,6 +44,12 @@ L2PcInstance player = getClient().getActiveChar(); if (player != null) { + if (!player.isInsideZone(L2Character.ZONE_STORE)) + { + player.sendMessage("You cannot open a private store here!"); + sendPacket(ActionFailed.STATIC_PACKET); + return; + } player.tryOpenPrivateSellStore(); } } Now you should set up the zone in data/xml/zone.xml <!-- Store Zone --> <zone id='20000' type='StoreZone' shape='Cuboid' minZ='-3500' maxZ='-3400' /> And the zone_vertices: INSERT INTO `zone_vertices` (`id`,`order`,`x`,`y`) VALUES (20000,0,81151,147905), (20000,1,82713,149312); Basically, that is all you need.. http://prntscr.com/5ull6v http://prntscr.com/5ullrq http://prntscr.com/5ulmbq This may not be the best guide but... :lol: Edited January 19, 2015 by Tessa
0 Tessa Posted January 18, 2015 Posted January 18, 2015 You should first set up an zone (or use zone that already exists), then in RequestPrivateStoreManageBuy/Sell just check if the player is inside that zone.
0 SweeTs Posted January 18, 2015 Posted January 18, 2015 There is so called NoStore zone, you have to create it.
0 Rio Posted January 19, 2015 Author Posted January 19, 2015 There is so called NoStore zone, you have to create it. so shall i create a new zone in zone.xml file like this? <zone type="TownZone" shape="NPoly" minZ="-3550" maxZ="-2600"><!-- Town of Goddard --> <spawn X="146272" Y="-58176" Z="-2979" /> <spawn X="145696" Y="-57696" Z="-2979" /> <spawn X="145264" Y="-57680" Z="-2979" /> <spawn X="145392" Y="-56960" Z="-2979" /> <spawn X="144752" Y="-56752" Z="-2979" /> <spawn X="144960" Y="-56224" Z="-2979" /> <spawn X="144944" Y="-55392" Z="-2979" /> <spawn X="144496" Y="-55088" Z="-2979" /> <zone type="NoStoreZone" shape="NPoly" minZ="-3550" maxZ="-2600"><!-- Town of Goddard --> <spawn X="146272" Y="-58176" Z="-2979" /> <spawn X="145696" Y="-57696" Z="-2979" /> <spawn X="145264" Y="-57680" Z="-2979" /> <spawn X="145392" Y="-56960" Z="-2979" /> <spawn X="144752" Y="-56752" Z="-2979" /> <spawn X="144960" Y="-56224" Z="-2979" /> <spawn X="144944" Y="-55392" Z="-2979" /> <spawn X="144496" Y="-55088" Z="-2979" />
0 Tessa Posted January 19, 2015 Posted January 19, 2015 (edited) Yep, along with the core side. EDIT: If you use aCis or frozen, the zone is implemented and you should only set it up :P Edited January 19, 2015 by Tessa
0 Rio Posted January 19, 2015 Author Posted January 19, 2015 (edited) Yep, along with the core side. EDIT: If you use aCis, the zone is implemented and you should only set it up :P can u guide me what to change in the core side please? p.s im usng l2jhellas Edited January 19, 2015 by Rio
0 Tessa Posted January 19, 2015 Posted January 19, 2015 I've never tried l2jhellas and I don't know if they have such a zone... I have to check.
0 Rio Posted January 20, 2015 Author Posted January 20, 2015 (edited) Well, I will guide you through the zone creation, but I will use a pack that I'm currently working on... so l2jhellas implementation might be little different. First you should create the zone: Index: java/net/sf/l2j/gameserver/model/zone/type/L2StoreZone.java =================================================================== --- java/net/sf/l2j/gameserver/model/zone/type/L2StoreZone.java (revision 0) +++ java/net/sf/l2j/gameserver/model/zone/type/L2StoreZone.java (working copy) @@ -0,0 +1,64 @@ +/* This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + * + * http://www.gnu.org/copyleft/gpl.html + */ +package net.sf.l2j.gameserver.model.zone.type; + +import net.sf.l2j.gameserver.model.L2Character; +import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance; +import net.sf.l2j.gameserver.model.zone.L2ZoneType; + +/** + * A scripted zone... + * Creation of such a zone should require somekind + * of jython script reference which can handle onEnter() / onExit() + * + * @author durgus + */ +public class L2StoreZone extends L2ZoneType +{ + public L2StoreZone(int id) + { + super(id); + } + + @Override + protected void onEnter(L2Character character) + { + if (character instanceof L2PcInstance) + { + character.setInsideZone(L2Character.ZONE_STORE, true); + ((L2PcInstance) character).sendMessage("You enter the private store zone!"); + } + } + + @Override + protected void onExit(L2Character character) + { + if (character instanceof L2PcInstance) + { + character.setInsideZone(L2Character.ZONE_STORE, false); + ((L2PcInstance) character).sendMessage("You left the private store zone!"); + } + } + + @Override + protected void onDieInside(L2Character character) {} + + @Override + protected void onReviveInside(L2Character character) {} + +} All of these methods SHOULD be here, because you extend the abstract class L2ZoneType which requires that. Then you should add the new zone in L2Character: Index: java/net/sf/l2j/gameserver/model/L2Character.java =================================================================== --- java/net/sf/l2j/gameserver/model/L2Character.java (revision 385) +++ java/net/sf/l2j/gameserver/model/L2Character.java (working copy) @@ -189,6 +189,7 @@ public static final int ZONE_WATER = 128; public static final int ZONE_JAIL = 256; public static final int ZONE_MONSTERTRACK = 512; + public static final int ZONE_STORE = 1024; private int _currentZones = 0; Currently I don't know how the zone system works, but it should be that way :lol: In my pack I have to load the zone that way: Index: java/net/sf/l2j/gameserver/datatables/ZoneData.java =================================================================== --- java/net/sf/l2j/gameserver/datatables/ZoneData.java (revision 385) +++ java/net/sf/l2j/gameserver/datatables/ZoneData.java (working copy) @@ -49,6 +49,7 @@ import net.sf.l2j.gameserver.model.zone.type.L2JailZone; import net.sf.l2j.gameserver.model.zone.type.L2MotherTreeZone; import net.sf.l2j.gameserver.model.zone.type.L2NoLandingZone; +import net.sf.l2j.gameserver.model.zone.type.L2StoreZone; import net.sf.l2j.gameserver.model.zone.type.L2OlympiadStadiumZone; import net.sf.l2j.gameserver.model.zone.type.L2PeaceZone; import net.sf.l2j.gameserver.model.zone.type.L2TownZone; @@ -171,6 +172,8 @@ temp = new L2BossZone(zoneId); else if (zoneType.equals("WaterZone")) temp = new L2WaterZone(zoneId); + else if (zoneType.equals("StoreZone")) + temp = new L2StoreZone(zoneId); // Check for unknown type I don't know if the zone should be registered in l2jhellas... Finally you should check if the player is inside the zone: Index: java/net/sf/l2j/gameserver/clientpackets/RequestPrivateStoreManageBuy.java =================================================================== --- java/net/sf/l2j/gameserver/clientpackets/RequestPrivateStoreManageBuy.java (revision 385) +++ java/net/sf/l2j/gameserver/clientpackets/RequestPrivateStoreManageBuy.java (working copy) @@ -18,7 +18,9 @@ */ package net.sf.l2j.gameserver.clientpackets; +import net.sf.l2j.gameserver.model.L2Character; import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance; +import net.sf.l2j.gameserver.serverpackets.ActionFailed; /** * This class ... @@ -42,6 +44,12 @@ L2PcInstance player = getClient().getActiveChar(); if (player != null) { + if (!player.isInsideZone(L2Character.ZONE_STORE)) + { + player.sendMessage("You cannot open a private store here!"); + sendPacket(ActionFailed.STATIC_PACKET); + return; + } player.tryOpenPrivateBuyStore(); } } Index: java/net/sf/l2j/gameserver/clientpackets/RequestPrivateStoreManageSell.java =================================================================== --- java/net/sf/l2j/gameserver/clientpackets/RequestPrivateStoreManageSell.java (revision 385) +++ java/net/sf/l2j/gameserver/clientpackets/RequestPrivateStoreManageSell.java (working copy) @@ -18,7 +18,9 @@ */ package net.sf.l2j.gameserver.clientpackets; +import net.sf.l2j.gameserver.model.L2Character; import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance; +import net.sf.l2j.gameserver.serverpackets.ActionFailed; /** * This class ... @@ -42,6 +44,12 @@ L2PcInstance player = getClient().getActiveChar(); if (player != null) { + if (!player.isInsideZone(L2Character.ZONE_STORE)) + { + player.sendMessage("You cannot open a private store here!"); + sendPacket(ActionFailed.STATIC_PACKET); + return; + } player.tryOpenPrivateSellStore(); } } Now you should set up the zone in data/xml/zone.xml <!-- Store Zone --> <zone id='20000' type='StoreZone' shape='Cuboid' minZ='-3500' maxZ='-3400' /> And the zone_vertices: INSERT INTO `zone_vertices` (`id`,`order`,`x`,`y`) VALUES (20000,0,81151,147905), (20000,1,82713,149312); Basically, that is all you need.. http://prntscr.com/5ull6v http://prntscr.com/5ullrq http://prntscr.com/5ulmbq This may not be the best guide but... :lol: thnx Tessa your the best ! It worked ! Edited January 20, 2015 by Rio
Question
Rio
Hello guys i wonder if you can help me to restrict private store in whole Giran and allow them only in specific place example (im using l2jHellas):
Edited by Rio
9 answers to this question
Recommended Posts