Share Трансфер навыков персонажа питомцу; Transfer char skill to summon

Жаба

Heir
Customer
[CODE
package services;

import l2.commons.listener.EventListener;
import l2.gameserver.GameServer;
import l2.gameserver.listener.actor.player.OnPlayerEnterListener;
import l2.gameserver.model.Player;
import l2.gameserver.model.Skill;
import l2.gameserver.model.actor.listener.PlayerListenerList;
import l2.gameserver.scripts.Functions;
import l2.gameserver.scripts.ScriptFile;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;

import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ThreadLocalRandom;

@SuppressWarnings("unused")
public class SkillRemove extends Functions implements ScriptFile, EventListener, OnPlayerEnterListener {
private static final Logger _log = LoggerFactory.getLogger(SkillRemove.class);
private static final String EVENT_LEARN_SKILL = "onSkillLearned";
private static final Map<Integer, List<Integer>> DATA = new HashMap<>();

@Override
public void onPlayerEnter(Player player) {
if (player == null || DATA.isEmpty()) return;

boolean updated = false;
for (var entry : DATA.entrySet()) {
int mainId = entry.getKey();
List<Integer> targets = entry.getValue();
List<Integer> found = new ArrayList<>();

if (player.getKnownSkill(mainId) != null) found.add(mainId);
for (int id : targets) {
if (player.getKnownSkill(id) != null) found.add(id);
}

if (found.size() > 1) {
int keptId = found.get(ThreadLocalRandom.current().nextInt(found.size()));
for (int id : found) {
if (id != keptId) {
if (remove(player, id)) updated = true;
}
}
}
}
if (updated) refresh(player);
}

private boolean remove(Player player, int id) {
Skill s = player.getKnownSkill(id);
if (s != null) {
String name = s.getName();
player.removeSkillById(id);
player.sendMessage("Конфликт: умение " + name + " полностью удалено.");
_log.info("SkillRemove: Fully removed skill {} from {}", name, player.getName());
return true;
}
return false;
}

private void refresh(Player player) {
player.sendSkillList();
player.updateStats();
}

@Override
public void onEvent(String event, Object... args) {
if (EVENT_LEARN_SKILL.equals(event) && args[0] instanceof Player p && args[1] instanceof Skill s) {
List<Integer> targets = DATA.get(s.getId());
if (targets != null) {
boolean updated = false;
for (int id : targets) {
if (remove(p, id)) updated = true;
}
if (updated) refresh(p);
}
}
}

@Override
public String[] listeningEventTypes() {
return new String[]{EVENT_LEARN_SKILL};
}

@Override
public void onLoad() {
load();
if (!DATA.isEmpty()) {
GameServer.getInstance().getListeners().addEventListener(this);
PlayerListenerList.addGlobal(this);
_log.info("SkillRemove: Loaded {} rules.", DATA.size());
}
}

@Override
public void onReload() {}

@Override
public void onShutdown() {}

private void load() {
DATA.clear();
File f = new File("data/SkillRemove.xml");
if (!f.exists()) return;
try {
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(f);
Node list = doc.getElementsByTagName("list").item(0);
if (list == null) return;
for (Node n = list.getFirstChild(); n != null; n = n.getNextSibling()) {
if ("skill".equalsIgnoreCase(n.getNodeName())) {
NamedNodeMap a = n.getAttributes();
int id = Integer.parseInt(a.getNamedItem("id").getNodeValue());
String[] r = a.getNamedItem("remove").getNodeValue().split(",");
List<Integer> tl = new ArrayList<>();
for (String s : r) tl.add(Integer.parseInt(s.trim()));
DATA.put(id, tl);
}
}
} catch (Exception e) {
_log.error("SkillRemove: XML Error", e);
}
}
}
[/CODE]


При призыве питомца передаём ему навыки хозяина из указанного листа, учитывает уровни. Восстанавливает полностью ему HP/MP после передачи.
Legacy (525)
 

Attachments

Back
Top