Jump to content

Recommended Posts

Posted (edited)

 

package l2s.gameserver.baylee;

import java.awt.Color;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import l2s.gameserver.geometry.Location;
import l2s.gameserver.model.Player;
import l2s.gameserver.network.l2.s2c.ExServerPrimitivePacket;

/**
 * @author Belly <3
 * @date July 7, 2022
 */
public class ZoneBuilder
{
	private static final Map<Player, LinkedList<Location>> map = new HashMap<>();
	private static final ZoneBuilder instance = new ZoneBuilder();

	public static ZoneBuilder getInstance() {
		return instance;
	}

	public void addPoint(Player player, Location loc) {
		LinkedList<Location> locs = map.get(player);
		if (locs == null) {
			locs = new LinkedList<>();
			map.put(player, locs);
		}
		locs.add(loc);
	}

	public LinkedList<Location> getLocations(Player player) {
		return map.get(player);
	}
	
	public void clearZone(Player player) {
		map.remove(player);
	}

	public void buildZone(Player player) {
		try {
			final String fileName = player.getName() + "-" + System.currentTimeMillis() / 1000;
			final File spawnFile = new File(fileName + ".txt");
			final BufferedWriter writer = new BufferedWriter(new FileWriter(spawnFile));
			String out = "";
			final LinkedList<Location> locs = map.get(player);
			if (locs != null && !locs.isEmpty()) {
				out += "\t<zone name=\"[" + player.getName() + "_Zone" + System.currentTimeMillis() / 36_000 + "]\" type=\"dummy\">\n";
				out += "\t\t<polygon>\n";
				for (Location loc : locs)
					out += "\t\t\t<coords loc=\"" + loc.getX() + " " + loc.getY() + " " + (loc.getZ() - 1000) + " " + (loc.getZ() + 1000) + "\"/>\n";
				out += "\t\t</polygon>\n";
				out += "\t</zone>";
			}
			writer.write(out);
			writer.close();
			player.unsetVar("@admin_drawzone");
			player.sendGfxMessage("Zone saved under " + fileName + ".txt");
			clearZone(player);
			final ExServerPrimitivePacket packet = new ExServerPrimitivePacket("ZoneBuilder", player.getX(), player.getY(), 65535 + player.getZ());
			packet.addPoint(Color.GREEN, 0, 0, Short.MIN_VALUE);
			player.sendPacket(packet);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

c2s -> MoveBackwardToLocation

		/** Belly - new draw zone by click **/
		if (activeChar.isGM() && activeChar.getVarBoolean("@admin_drawzone", false)) {
			ZoneBuilder.getInstance().addPoint(activeChar, _targetLoc);
			final LinkedList<Location> locs = ZoneBuilder.getInstance().getLocations(activeChar);
			if (locs.size() > 1) {
				final ExServerPrimitivePacket packet = new ExServerPrimitivePacket("ZoneBuilder", locs.get(0).getX(), locs.get(0).getY(), 65535 + locs.get(0).getZ());
				for (int i = 1; i < locs.size(); i++) {
					packet.addPoint("" + i, Color.RED, true, locs.get(i).getX(), locs.get(i).getY(), locs.get(i).getZ());
					packet.addLine(Color.GREEN, locs.get(i - 1).getX(), locs.get(i - 1).getY(), locs.get(i - 1).getZ(), locs.get(i).getX(), locs.get(i).getY(), locs.get(i).getZ());
				}
				activeChar.sendPacket(packet);
			}
			activeChar.sendGfxMessage("Point saved " + _targetLoc);
			activeChar.sendActionFailed();
			return;
		}

 

AdminCommandHandler

			
			case admin_drawzone: {
				if (!activeChar.getVarBoolean("@admin_drawzone", false)) {
					activeChar.setVar("@admin_drawzone", true);
					activeChar.sendGfxMessage("Draw zone active -> click on point to record");
					activeChar.sendGfxMessage("//drawzone to unset and save");
				}
				else {
					activeChar.ask(new ConfirmDlgPacket(SystemMsg.S1, 0).addString("Save zone and export to text file?"), new OnAnswerListener()
					{
						@Override
						public void sayYes() {
							ZoneBuilder.getInstance().buildZone(activeChar);
						}

						@Override
						public void sayNo() {
							ZoneBuilder.getInstance().clearZone(activeChar);
							activeChar.sendGfxMessage("Zone drawing cleared.");
						}
					});
				}
				break;
			}

 

PJVgTiv.png

 

simple tool to draw zones faster

if it works it works..

Edited by eMommy
  • Like 3
  • Upvote 1
Posted

1) ZoneBuilder class can be final since you're using a singleton approach.

2) addPoint method can be simplified to this:

 

public void addPoint(Player player, Location loc)
{
	LinkedList<Location> locs = map.get(player);
	if (locs == null)
	{
		locs = new LinkedList<>();
		map.put(player, locs);
	}
  
	locs.add(loc);
}

 

3) You should use a singleton holder approach as

 

private static ZoneBuilder instance;

 

should be final. Check similar classes in your source.

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


×
×
  • 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