Jump to content

Question

Posted (edited)

Hello ppl of mxc, i never post anything or ask for anything,but this last few days i almost melt my brain trying to get to work Clan quest for acis, i dont care about the rev in this case 370 i've got the code without errors, quest started all ok, but mobs don't drop the items, or when killed Grave Guards,  grave keymaster isnt spawning,the same happen with the box when imperal gravekeeper is killed. this is the code im trying to get to work. alsoi i had to add some lines to Quest but those are not improtant, just a few typos i had form the code below.

Blitz.jpg
Drake.jpg
Fritz.jpg
giantscave.jpg
Grave-Guard-don-spawn.jpg
Kurtz.jpg
Lutz.jpg
Scepter.jpg
 

clan.jpg

package net.sf.l2j.gameserver.scripting.quests;

import net.sf.l2j.commons.random.Rnd;

import net.sf.l2j.gameserver.model.L2Skill;
import net.sf.l2j.gameserver.model.actor.Npc;
import net.sf.l2j.gameserver.model.actor.instance.Player;
import net.sf.l2j.gameserver.scripting.Quest;
import net.sf.l2j.gameserver.scripting.QuestState;

public class Q503_PursuitOfClanAmbition extends Quest
{
	private static final int G_LET_MARTIEN = 3866;
	private static final int TH_WYRM_EGGS = 3842;
	private static final int DRAKE_EGGS = 3841;
	private static final int BL_WYRM_EGGS = 3840;
	private static final int MI_DRAKE_EGGS = 3839;
	private static final int BROOCH = 3843;
	private static final int BL_ANVIL_COIN = 3871;
	
	private static final int G_LET_BALTHAZAR = 3867;
	private static final int RECIPE_POWER_STONE = 3838;
	private static final int POWER_STONE = 3846;
	private static final int NEBULITE_CRYSTALS = 3844;
	private static final int BROKE_POWER_STONE = 3845;
	
	private static final int G_LET_RODEMAI = 3868;
	private static final int IMP_KEYS = 3847;
	private static final int SCEPTER_JUDGEMENT = 3869;

	private static final int PROOF_ASPIRATION = 3870;

	private static final int MARTIEN = 30645;
	private static final int ATHREA = 30758;
	private static final int KALIS = 30759;
	private static final int GUSTAF = 30760;
	private static final int FRITZ = 30761;
	private static final int LUTZ = 30762;
	private static final int KURTZ = 30763;
	private static final int KUSTO = 30512;
	private static final int BALTHAZAR = 30764;
	private static final int RODEMAI = 30868;
	private static final int COFFER = 30765;
	private static final int CLEO = 30766;
	
	private static final int THUNDER_WYRM = 20282;
	private static final int THUNDER_WYRM_TWO = 20243;
	private static final int DRAKE = 20137;
	private static final int DRAKE_TWO = 20285;
	private static final int BLITZ_WYRM = 27178;
	private static final int GIANT_SOLDIER = 20654;
	private static final int GIANT_SCOUT = 20656;
	private static final int GRAVE_GUARD = 20668;
	private static final int GRAVE_KEYMASTER = 27179;
	private static final int IMPERIAL_SLAVE = 27180;
	private static final int IMPERIAL_GRAVEKEEPER = 27181;

	private static final int[][] DROPLIST =
	{
		// npcId, cond, MaxCount, chance, item1, item2 (giants), item3 (giants)
		// @formatter:off
		{THUNDER_WYRM, 2, 10, 200000, TH_WYRM_EGGS, 0, 0},
		{THUNDER_WYRM_TWO, 2, 10, 90000, TH_WYRM_EGGS, 0, 0},
		{DRAKE, 2, 10, 200000, DRAKE_EGGS, 0, 0},
		{DRAKE_TWO, 2, 10, 250000, DRAKE_EGGS, 0, 0},
		{BLITZ_WYRM, 2, 10, 1000000, BL_WYRM_EGGS, 0, 0},
		{GIANT_SOLDIER, 5, 10, 250000, NEBULITE_CRYSTALS, BROKE_POWER_STONE, POWER_STONE},
		{GIANT_SCOUT, 5, 10, 350000, NEBULITE_CRYSTALS, BROKE_POWER_STONE, POWER_STONE},
		{GRAVE_GUARD, 10, 0, 150000, 0, 0, 0},
		{GRAVE_KEYMASTER, 10, 6, 800000, IMP_KEYS, 0, 0},
		{IMPERIAL_GRAVEKEEPER, 10, 0, 0, 0, 0, 0}
		// @formatter:on
	};
	
	public Q503_PursuitOfClanAmbition()
	{
		super(503, "Pursuit of Clan Ambition!");
		
		setItemsIds(MI_DRAKE_EGGS, BL_WYRM_EGGS, DRAKE_EGGS, TH_WYRM_EGGS, BROOCH, NEBULITE_CRYSTALS, BROKE_POWER_STONE, POWER_STONE, IMP_KEYS, G_LET_MARTIEN, G_LET_BALTHAZAR, G_LET_RODEMAI, SCEPTER_JUDGEMENT);
		
		addStartNpc(GUSTAF);
		addTalkId(MARTIEN, ATHREA, KALIS, GUSTAF, FRITZ, LUTZ, KURTZ, KUSTO, BALTHAZAR, RODEMAI, COFFER, CLEO);
		
		addKillId(THUNDER_WYRM_TWO, THUNDER_WYRM, DRAKE, DRAKE_TWO, BLITZ_WYRM, GIANT_SOLDIER, GIANT_SCOUT, GRAVE_GUARD, GRAVE_KEYMASTER, IMPERIAL_GRAVEKEEPER);
		addAttackId(IMPERIAL_GRAVEKEEPER);
	}
	
	@Override
	public String onAdvEvent(String event, Npc npc, Player player)
	{
		String htmltext = event;
		final QuestState st = player.getQuestState(getName());
		if (st == null)
		{
			return htmltext;
		}
		
		// Gustaf
		if (event.equalsIgnoreCase("30760-08.htm"))
		{
			st.setState(STATE_STARTED);
			st.giveItems(G_LET_MARTIEN, 1);
			st.set("cond", "1");
		}
		else if (event.equalsIgnoreCase("30760-12.htm"))
		{
			st.giveItems(G_LET_BALTHAZAR, 1);
			st.set("cond", "4");
		}
		else if (event.equalsIgnoreCase("30760-16.htm"))
		{
			st.giveItems(G_LET_RODEMAI, 1);
			st.set("cond", "7");
		}
		else if (event.equalsIgnoreCase("30760-20.htm"))
		{
			st.takeItems(SCEPTER_JUDGEMENT, -1);
			st.giveItems(PROOF_ASPIRATION, 1);
			st.rewardExpAndSp(0, 250000);
			st.exitQuest(false);
			finishQuestToClan(player);
		}
		else if (event.equalsIgnoreCase("30760-22.htm"))
		{
			st.set("cond", "1");
		}
		else if (event.equalsIgnoreCase("30760-23.htm"))
		{
			st.takeItems(SCEPTER_JUDGEMENT, -1);
			st.giveItems(PROOF_ASPIRATION, 1);
			st.rewardExpAndSp(0, 250000);
			st.exitQuest(false);
			finishQuestToClan(player);
		}
		// Martien
		else if (event.equalsIgnoreCase("30645-03.htm"))
		{
			setQuestToClanMembers(player);
			st.takeItems(G_LET_MARTIEN, -1);
			st.set("cond", "2");
			st.set("kurt", "0");
		}
		// Kurtz
		else if (event.equalsIgnoreCase("30763-02.htm"))
		{
			st.giveItems(MI_DRAKE_EGGS, 6);
			st.giveItems(BROOCH, 1);
			st.set("kurt", "1");
		}
		// Lutz
		else if (event.equalsIgnoreCase("30762-02.htm"))
		{
			st.giveItems(MI_DRAKE_EGGS, 4);
			st.giveItems(BL_WYRM_EGGS, 3);
			st.addSpawn(BLITZ_WYRM, npc.getX(), npc.getY(), npc.getZ(), npc.getHeading(), true, 0, false);
			st.addSpawn(BLITZ_WYRM, npc.getX(), npc.getY(), npc.getZ(), npc.getHeading(), true, 0, false);
			st.set("lutz", "1");
		}
		// Fritz
		else if (event.equalsIgnoreCase("30761-02.htm"))
		{
			st.giveItems(BL_WYRM_EGGS, 3);
			st.addSpawn(BLITZ_WYRM, npc.getX(), npc.getY(), npc.getZ(), npc.getHeading(), true, 0, false);
			st.addSpawn(BLITZ_WYRM, npc.getX(), npc.getY(), npc.getZ(), npc.getHeading(), true, 0, false);
			st.set("fritz", "1");
		}
		// Kusto
		else if (event.equalsIgnoreCase("30512-03.htm"))
		{
			st.takeItems(BROOCH, 1);
			st.giveItems(BL_ANVIL_COIN, 1);
			st.set("kurt", "2");
		}
		// Balthazar
		else if (event.equalsIgnoreCase("30764-03.htm"))
		{
			st.takeItems(G_LET_BALTHAZAR, -1);
			st.set("cond", "5");
		}
		else if (event.equalsIgnoreCase("30764-05.htm"))
		{
			st.takeItems(G_LET_BALTHAZAR, -1);
			st.set("cond", "5");
		}
		else if (event.equalsIgnoreCase("30764-06.htm"))
		{
			st.takeItems(BL_ANVIL_COIN, -1);
			st.giveItems(RECIPE_POWER_STONE, 1);
		}
		// Rodemai
		else if (event.equalsIgnoreCase("30868-04.htm"))
		{
			st.takeItems(G_LET_RODEMAI, -1);
			st.set("cond", "8");
		}
		else if (event.equalsIgnoreCase("30868-06a.htm"))
		{
			st.set("cond", "10");
		}
		else if (event.equalsIgnoreCase("30868-10.htm"))
		{
			st.set("cond", "12");
		}
		// Cleo
		else if (event.equalsIgnoreCase("30766-04.htm"))
		{
			st.set("cond", "9");
			npc.broadcastNpcSay("Blood and Honor");
			final Npc sister1 = addSpawn(KALIS, 160665, 21209, -3710, npc.getHeading(), false, 180000, false);
			sister1.broadcastNpcSay("Ambition and Power");
			final Npc sister2 = addSpawn(ATHREA, 160665, 21291, -3710, npc.getHeading(), false, 180000, false);
			sister2.broadcastNpcSay("War and Death");
		}
		// Coffer
		else if (event.equalsIgnoreCase("Open"))
		{
			if (st.getQuestItemsCount(IMP_KEYS) < 6)
			{
				htmltext = "30765-03a.htm";
			}
			else
			{
				htmltext = "30765-03.htm";
				st.set("cond", "11");
				st.takeItems(IMP_KEYS, 6);
				st.giveItems(SCEPTER_JUDGEMENT, 1);
			}
		}
		
		return htmltext;
	}
	
	@Override
	public String onTalk(Npc npc, Player player)
	{
		String htmltext = getNoQuestMsg();
		final QuestState st = player.getQuestState(getName());
		if (st == null)
		{
			return htmltext;
		}
		
		switch (st.getState())
		{
			case STATE_CREATED:
				if (player.getClan() == null)
				{
					htmltext = "30760-01.htm";
					st.exitQuest(true);
				}
				else if (player.isClanLeader())
				{
					if (st.hasQuestItems(PROOF_ASPIRATION))
					{
						htmltext = "30760-03.htm";
						st.exitQuest(true);
					}
					else if (player.getClan().getLevel() != 4)
					{
						htmltext = "30760-02.htm";
						st.exitQuest(true);
					}
					else
					{
						htmltext = "30760-04.htm";
					}
				}
				else
				{
					htmltext = "30760-04t.htm";
					st.exitQuest(true);
				}
				break;
			
			case STATE_STARTED:
				final int cond = st.getInt("cond");
				int memberCond = 0;
				if (getClanLeaderQuestState(player, npc) != null)
				{
					memberCond = getClanLeaderQuestState(player, npc).getInt("cond");
				}
				
				switch (npc.getNpcId())
				{
					case GUSTAF:
						if (player.isClanLeader())
						{
							if (cond == 1)
							{
								htmltext = "30760-09.htm";
							}
							else if (cond == 2)
							{
								htmltext = "30760-10.htm";
							}
							else if (cond == 3)
							{
								htmltext = "30760-11.htm";
							}
							else if (cond == 4)
							{
								htmltext = "30760-13.htm";
							}
							else if (cond == 5)
							{
								htmltext = "30760-14.htm";
							}
							else if (cond == 6)
							{
								htmltext = "30760-15.htm";
							}
							else if (cond == 7)
							{
								htmltext = "30760-17.htm";
							}
							else if (cond == 12)
							{
								htmltext = "30760-19.htm";
							}
							else if (cond == 13)
							{
								htmltext = "30760-24.htm";
							}
							else
							{
								htmltext = "30760-18.htm";
							}
						}
						else
						{
							if (memberCond == 3)
							{
								htmltext = "30760-11t.htm";
							}
							else if (memberCond == 4)
							{
								htmltext = "30760-15t.htm";
							}
							else if (memberCond == 12)
							{
								htmltext = "30760-19t.htm";
							}
							else if (memberCond == 13)
							{
								htmltext = "30766-24t.htm";
							}
						}
						break;
					
					case MARTIEN:
						if (player.isClanLeader())
						{
							if (cond == 1)
							{
								htmltext = "30645-02.htm";
							}
							else if (cond == 2)
							{
								if ((st.getQuestItemsCount(MI_DRAKE_EGGS) > 9) && (st.getQuestItemsCount(BL_WYRM_EGGS) > 9) && (st.getQuestItemsCount(DRAKE_EGGS) > 9) && (st.getQuestItemsCount(TH_WYRM_EGGS) > 9))
								{
									htmltext = "30645-05.htm";
									st.set("cond", "3");
									st.takeItems(MI_DRAKE_EGGS, -1);
									st.takeItems(BL_WYRM_EGGS, -1);
									st.takeItems(DRAKE_EGGS, -1);
									st.takeItems(TH_WYRM_EGGS, -1);
								}
								else
								{
									htmltext = "30645-04.htm";
								}
							}
							else if (cond == 3)
							{
								htmltext = "30645-07.htm";
							}
							else
							{
								htmltext = "30645-08.htm";
							}
						}
						else
						{
							if ((memberCond == 1) || (memberCond == 2) || (memberCond == 3))
							{
								htmltext = "30645-01.htm";
							}
						}
						break;
					
					case LUTZ:
						if (player.isClanLeader() && (cond == 2))
						{
							if (st.getInt("lutz") == 1)
							{
								htmltext = "30762-03.htm";
							}
							else
							{
								htmltext = "30762-01.htm";
							}
						}
						break;
					
					case KURTZ:
						if (player.isClanLeader() && (cond == 2))
						{
							if (st.getInt("kurt") == 1)
							{
								htmltext = "30763-03.htm";
							}
							else
							{
								htmltext = "30763-01.htm";
							}
						}
						break;
					
					case FRITZ:
						if (player.isClanLeader() && (cond == 2))
						{
							if (st.getInt("fritz") == 1)
							{
								htmltext = "30761-03.htm";
							}
							else
							{
								htmltext = "30761-01.htm";
							}
						}
						break;
					
					case KUSTO:
						if (player.isClanLeader())
						{
							if (st.getQuestItemsCount(BROOCH) == 1)
							{
								if (st.getInt("kurt") == 0)
								{
									htmltext = "30512-01.htm";
								}
								else if (st.getInt("kurt") == 1)
								{
									htmltext = "30512-02.htm";
								}
								else
								{
									htmltext = "30512-04.htm";
								}
							}
						}
						else
						{
							if ((memberCond > 2) && (memberCond < 6))
							{
								htmltext = "30512-01a.htm";
							}
						}
						break;
					
					case BALTHAZAR:
						if (player.isClanLeader())
						{
							if (cond == 4)
							{
								if (st.getInt("kurt") == 2)
								{
									htmltext = "30764-04.htm";
								}
								else
								{
									htmltext = "30764-02.htm";
								}
							}
							else if (cond == 5)
							{
								if ((st.getQuestItemsCount(POWER_STONE) > 9) && (st.getQuestItemsCount(NEBULITE_CRYSTALS) > 9))
								{
									htmltext = "30764-08.htm";
									st.takeItems(POWER_STONE, -1);
									st.takeItems(NEBULITE_CRYSTALS, -1);
									st.takeItems(BROOCH, -1);
									st.set("cond", "6");
								}
								else
								{
									htmltext = "30764-07.htm";
								}
							}
							else if (cond == 6)
							{
								htmltext = "30764-09.htm";
							}
						}
						else
						{
							if (memberCond == 4)
							{
								htmltext = "30764-01.htm";
							}
						}
						break;
					
					case RODEMAI:
						if (player.isClanLeader())
						{
							if (cond == 7)
							{
								htmltext = "30868-02.htm";
							}
							else if (cond == 8)
							{
								htmltext = "30868-05.htm";
							}
							else if (cond == 9)
							{
								htmltext = "30868-06.htm";
							}
							else if (cond == 10)
							{
								htmltext = "30868-08.htm";
							}
							else if (cond == 11)
							{
								htmltext = "30868-09.htm";
							}
							else if (cond == 12)
							{
								htmltext = "30868-11.htm";
							}
						}
						else
						{
							if (memberCond == 7)
							{
								htmltext = "30868-01.htm";
							}
							else if ((memberCond == 9) || (memberCond == 10))
							{
								htmltext = "30868-07.htm";
							}
						}
						break;
					
					case CLEO:
						if (player.isClanLeader())
						{
							if (cond == 8)
							{
								htmltext = "30766-02.htm";
							}
							else if (cond == 9)
							{
								htmltext = "30766-05.htm";
							}
							else if (cond == 10)
							{
								htmltext = "30766-06.htm";
							}
							else if ((cond == 11) || (cond == 12) || (cond == 13))
							{
								htmltext = "30766-07.htm";
							}
						}
						else
						{
							if (memberCond == 8)
							{
								htmltext = "30766-01.htm";
							}
						}
						break;
					
					case COFFER:
						if (player.isClanLeader())
						{
							if (cond == 10)
							{
								htmltext = "30765-01.htm";
							}
						}
						else
						{
							if (memberCond == 10)
							{
								htmltext = "30765-02.htm";
							}
						}
						break;
					
					case KALIS:
						if (player.isClanLeader())
						{
							htmltext = "30759-01.htm";
						}
						break;
					
					case ATHREA:
						if (player.isClanLeader())
						{
							htmltext = "30758-01.htm";
						}
						break;
				}
				break;
		}
		
		return htmltext;
	}
	
	@Override
	public String onKill(Npc npc, Player player, boolean isPet)
	{
		QuestState st = null;
		st = getClanLeaderQuestState(player, npc);
		if ((st == null) || !st.isStarted())
		{
			return null;
		}
		
		for (int[] element : DROPLIST)
		{
			if (element[0] == npc.getNpcId())
			{
				final int cond = element[1];
				final int maxCount = element[2];
				final int chance = element[3];
				final int item1 = element[4];
				final int item2 = element[5];
				final int item3 = element[6];
				
				if (st.getInt("cond") == cond)
				{
					if (item1 != 0)
					{
						st.dropItems(item1, 1, maxCount, chance);
					}
					else
					{
						if (element[0] == IMPERIAL_GRAVEKEEPER)
						{
							final Npc coffer = addSpawn(COFFER, npc.getX(), npc.getY(), npc.getZ(), npc.getHeading(), true, 180000, false);
							coffer.broadcastNpcSay("Curse of the gods on the one that defiles the property of the empire!");
						}
						else if ((element[0] == GRAVE_GUARD) && (st.getQuestItemsCount(IMP_KEYS) < 6) && (Rnd.get(50) < chance))
						{
							addSpawn(GRAVE_KEYMASTER, player.getX(), player.getY(), player.getZ(), player.getHeading(), true, 0, false);
						}
					}
					if ((item2 != 0) && (item3 != 0))
					{
						if (Rnd.get(4) == 0)
						{
							st.dropItems(item2, 1, maxCount, chance);
						}
						else
						{
							st.dropItems(item3, 1, maxCount, chance);
						}
					}
				}
			}
		}
		
		return null;
	}
	
	@Override
	public String onAttack(Npc npc, Player attacker, int damage, boolean isPet, L2Skill skill)
	{
		if ((npc.getMaxHp() / 2) > npc.getCurrentHp())
		{
			if (Rnd.get(100) < 4)
			{
				addSpawn(IMPERIAL_SLAVE, npc.getX(), npc.getY(), npc.getZ(), npc.getHeading(), true, 0, false);
			}
			else
			{
				attacker.teleToLocation(185462, 20342, -3250, 0);
			}
		}
		return super.onAttack(npc, attacker, damage, isPet, skill);
	}
}

 

 

NVM, Fixed :) close this topic!

Edited by JackCerutti

0 answers to this question

Recommended Posts

There have been no answers to this question yet

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Posts

    • Hello guys, I’d like to introduce your audience to my original project, which has gained popularity in Europe and among the Russian-speaking community. I just never got around to posting about it here until now. At one point, I wanted to develop a launcher (game file downloader) in the browser, and that idea eventually evolved into a full-fledged CMS engine with extensive functionality. SphereWeb is a massive ecosystem for Lineage 2 JAVA servers, packed with everything a server administrator and players might need. From October 2024 to April 24, 2025, my project has been installed on 250 different domains. SphereWeb is your best choice — a modern web engine designed specifically for administrators of Lineage 2 Java game servers. It offers a rich and user-friendly interface for managing your server with ease. ✅ Player Control Panel – covers all player needs: Authorization, registration, password change, account linking and synchronization, contacting the admin via support system, teleporting a character (and sending items to warehouse) to a town, warehouse management (sending items in-game), and making server donations. ✅ Admin Control Panel – opens up new horizons, giving you access to: Extensive panel customization (more on this later) Donation history with charts News and page creation Stream management (add streams) Item shop creation Starter packs creation Bonus code generation XenForo news integration Email message settings Global activity log Traffic insights (track where your users come from) Extensions section (plugins – more on that later) Server management Auto software updates Tech support Custom translations Now, about the Control Panel settings: The standard settings are organized into several tabs: Language There are 5 available languages: Russian, English, Spanish, Portuguese, and Greek, covering 99% of translation needs. You can also set a default language for the panel.   Features Toggle built-in features of the control panel: News, Shop, Balance, Statistics, Support, Balance Transfer, Bonus Code, Streams, Data Emulation. Enable/disable options to keep the panel clean and focused on what you need. Captcha Support for Google reCAPTCHA, Cloudflare Turnstile, or default hCaptcha. Old-school recommendation: use Google reCAPTCHA v2. Fake Online Boosting Basic settings for boosting the online counter. Registration Settings Configuration options for the registration process. Email Connect your panel to an SMTP server. Misc General-purpose settings and adjustments. Template Choose and preview the design template for your landing page. Logo Upload your control panel logo and favicon. Palette Customize the color scheme of your control panel interface. Menu Add links to your site’s navigation menu. Background Upload high-resolution background images for login, registration, and password recovery pages. Notifications Set up Telegram notifications for selected events. In Sphere 2, I’ve paid special attention to plugins, making it easy to add and expand functionality. By default, the panel includes several built-in extensions (plugins).   Giveaway – allows you to host item giveaways for users directly on the website. Internal Forum – a built-in forum system inside the Control Panel (more details on it below). Launcher – a free solution for updating game files. It delivers unmatched speed and runs directly in the browser, allowing full design customization. Traders – (currently for Lucera2 only) displays a list of offline shops, their items, prices, and player locations directly on the website. Roulette – a fun game where users spin the wheel to win items. Item Editor – a tool for creating custom in-game items. Item Increase – tracks and displays item count by ID across the server in graph form, showing which players hold the most. Registration Statistics – a simple chart showing registration trends over time. SQL Collection – a plugin for adding or adjusting Java server builds if your current build isn’t supported or needs customization. ✅ Supported Java Server Builds The system currently supports a variety of popular Java server builds. Full list available in the admin panel. 🧩 Forum Plugin In the first version of Sphere, a basic internal forum was quite popular among server admins — so in Sphere 2, it came back better than ever. Inspired by XenForo, the forum is rich in features and designed for both community and solo players: Players can create clan communities to connect and play together. Clan creators can upload clan logos and header banners, customize text color for the clan name. Clan members can post on the public clan wall or chat in a dedicated clan chat. Clan logos and banners appear across the forum for all members. For players who like to show off: Under each username, the forum can display PvP/PK stats, in-game time, and character list. Players can choose to hide this data if they prefer privacy. Admins can assign moderator roles to users for specific forum sections, ensuring proper content management and community moderation.   💰 Donations & Rewards The administrator has a wide range of reward settings for player donations — almost every suggested method has been implemented: Cumulative discount system – discounts increase as the total donation amount grows. One-time bonus – an extra reward for a specific donation. Permanent shop discounts – based on the player's total donation history. One-time item shop discounts – also based on total donations. Item-based rewards – configurable rewards delivered automatically after donation. ✅ Supported Payment Systems (Current list is available in the admin panel and may vary by region.) 🔄 SphereWeb Auto-Update System Sphere is actively developed — I improve it almost daily. To ensure everyone stays updated, I’ve implemented multiple update methods: Automatic – once I push updates to GitHub, they are downloaded to Sphere clients within 5 minutes. Manual – if automatic updates are disabled or your site was offline during update release, you can trigger the update manually with one click. File Scanner – this feature scans your Sphere installation, compares files with the latest version, and shows missing or modified files you can restore. 📸 Control Panel Screenshots (Here you’d typically show screenshots or say where they can be found.)   💬 Final Words A lot of work has gone into this project. I occasionally post updates in the Sphere Telegram channel — when I don’t forget. I’m truly proud of the results. 🚀 Want to Install It? Before you rush in, please note: Installation won’t work on localhost. A valid SSL certificate is required. Repo: GitHub - Cannabytes/SphereWeb2 Upload the archive to your hosting. Open your website in the browser — the installer will guide you. ⚠️ Some Russian hosting providers block wide IP ranges, which may interfere with installation. 💸 Pricing Three usage plans available: Free – limited to 20 game account registrations per day. $12.5/month – no Sphere limitations. $20/month – no Sphere limitations + access to all commercial plugins. Your balance is shown in the admin panel, and you can renew access anytime. ✅ All users receive updates, regardless of subscription tier. A lot of work has been done, and from time to time I share updates in the Sphere Telegram channel — when I don’t forget. I’m truly proud of what I’ve built. Did you like it? Want to install it yourself? Please note — you won’t be able to install it on a local server. A valid SSL certificate is also required. Steps to install: Download the package from the GitHub repository: Cannabytes/SphereWeb2 Extract the archive on your hosting. Open your website in a browser — the installer will launch automatically. Just follow the instructions. 🔧 Minimum Requirements: PHP 8.2 MariaDB or MySQL 5.8 SSL certificate for your website   💵 Pricing SphereWeb offers 3 usage options: Free Plan – limited to 20 game account registrations per day. $12.5/month – no limitations, full access to Sphere features. 3. $20/month – no limitations + access to all commercial plugins. Your current balance is shown in the admin panel, and you can renew your license whenever you wish. Regardless of your plan, you will always receive updates. 🆕 Latest Updates: User Registration Source Tracking: Now, when a user registers, you can see where they came from before landing on the site via Telegram notifications. Bulk Deletion of Bonus Codes: Added functionality to bulk delete bonus codes for better management. Starter Pack Editor: A new editor for creating and managing starter packs is now available. Item Removal from Warehouse: Admins can now remove items from a user's warehouse. Server-Specific Settings: Each server now has a "Functions" button, providing additional customization options for each server. Warehouse Cleanup: Admins can now clear the warehouse for all users or by specific item ID. Custom Return Button: The "Return to Site" button can now be disabled, and you can set a custom link for it. Character List UI Overhaul: The character list in the admin panel has been redesigned to be more minimalist and user-friendly. User Info Page Improvements: The user information page has been enhanced for better navigation and access to key data. Donation History Updates: The donation history page has been improved for better data presentation. Item Stacking and Splitting: Users can now stack or split identical items (e.g., ID 57 (150) + ID 150 = ID 57 (300)). Admins can configure which items can be stacked and split. Account Deletion: Users now have the option to delete their own accounts from the account list. Success Chest Plugin: A new "Success Chest" plugin has been added, allowing admins to define chests with specific items, their prices, and visual parameters. Reworked Warehouse: The warehouse now operates in a separate modal window. When items are purchased, they are automatically added to the warehouse without page reloads. Registration Reward: Admins now have the ability to reward users for registration, adding more incentives. Item Stacking and Splitting Customization: Admins can now specify which items players can split and stack in their warehouse. These settings are available in the admin panel under the server's "Functions" button, offering granular control over item management. Account Deletion Feature: Players now have the ability to remove their accounts from the account list (but not from the server). In the future, this feature will be customizable for each server. Success Chest Plugin: A new "Success Chest" plugin has been added, allowing admins to define the items inside the chest. Players can then randomly draw one item from the chest. This feature is still in early testing, and any feedback or issues will be addressed in future updates. Improved Warehouse/Inventory: The warehouse/inventory system has been enhanced. Now, when items (such as starter packs or chests) are purchased, they are immediately added to the warehouse without requiring a page refresh. Additionally, the modal window for the warehouse now opens when the warehouse button is clicked with the mouse wheel. 😊 Log Sorting by Server: Logs now include the ability to sort by server, making it easier to manage and review data for each individual server. Registration Source Tracking: Telegram notifications now include information about where a user came from before registering on your site. Bulk Deletion of Bonus Codes: Admins can now bulk delete server-specific bonus codes, as well as bonus codes that were generated for all servers. Customizable Starter Packs: A new option has been added to modify and customize starter packs, giving more flexibility to server admins. Item Removal from Warehouse in Profile: Admins can now remove items from a user's warehouse directly from their profile. "Functions" Button in Admin Panel: A new "Functions" button has been added to the admin panel, offering additional tools for server management. This includes the ability to clear the server’s warehouse entirely or by specific item ID. Disabling the "Return to Site" Button: Under Admin Panel -> Settings -> Miscellaneous, there is now an option to disable the "Return to Site" button in the site menu
    • We are waiting you today at 8pm +3 GMT website: https://l2evo.net The patch will be available 30 min before the grand opening. Come join the best Interlude pvp server.  
    • We are certainly not an ambulance, but we will definitely cure you of blacklists and empty pockets. Live freely with SX! Each of you will receive a trial version of SX to familiarize yourself with the product, all you have to do is post in this thread
  • Topics

×
×
  • Create New...