[CODE
package services;
import l2.commons.listener.EventListener;
import l2.gameserver.GameServer;
import l2.gameserver.model.Player;
import l2.gameserver.model.Skill;
import l2.gameserver.model.Summon;
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.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
import java.util.HashSet;
import java.util.Set;
@SuppressWarnings("unused")
public class PetSkillMirror extends Functions implements ScriptFile, EventListener {
private static final Logger _log = LoggerFactory.getLogger(PetSkillMirror.class);
private static final Set<Integer> MIRROR_SKILLS = new HashSet<>();
private static final String EVENT_SUMMON = "onSummonServitor";
@Override
public String[] listeningEventTypes() {
return new String[]{EVENT_SUMMON};
}
@Override
public void onEvent(String eventType, Object... args) {
if (EVENT_SUMMON.equals(eventType) && args.length >= 2) {
if (args[0] instanceof Player player && args[1] instanceof Summon pet) {
syncPetSkills(player, pet);
}
}
}
private void syncPetSkills(Player player, Summon pet) {
boolean changed = false;
for (Integer skillId : MIRROR_SKILLS) {
Skill playerSkill = player.getKnownSkill(skillId);
Skill petSkill = pet.getKnownSkill(skillId);
if (playerSkill != null) {
if (petSkill == null || petSkill.getLevel() < playerSkill.getLevel()) {
pet.addSkill(playerSkill);
changed = true;
}
} else if (petSkill != null) {
pet.removeSkill(petSkill);
changed = true;
}
}
if (changed) {
pet.updateStats();
pet.setCurrentHp(pet.getMaxHp(), false);
pet.setCurrentMp(pet.getMaxMp());
pet.sendPetInfo();
pet.broadcastStatusUpdate();
player.sendMessage("Умения вашего питомца синхронизированы, показатели восстановлены.");
}
}
@Override
public void onLoad() {
loadConfig();
GameServer.getInstance().getListeners().addEventListener(this);
}
private void loadConfig() {
MIRROR_SKILLS.clear();
File file = new File("data/PetSkillMirror.xml");
if (!file.exists()) return;
try {
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file);
NodeList list = doc.getElementsByTagName("skill");
for (int i = 0; i < list.getLength(); i++) {
Node n = list.item(i);
if (n.hasAttributes()) {
Node idAttr = n.getAttributes().getNamedItem("id");
if (idAttr != null) {
try {
MIRROR_SKILLS.add(Integer.parseInt(idAttr.getNodeValue()));
} catch (NumberFormatException ignored) {}
}
}
}
} catch (Exception e) {
_log.error("PetSkillMirror error", e);
}
}
@Override public void onReload() {}
@Override public void onShutdown() {}
}
[/CODE]
package services;
import l2.commons.listener.EventListener;
import l2.gameserver.GameServer;
import l2.gameserver.model.Player;
import l2.gameserver.model.Skill;
import l2.gameserver.model.Summon;
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.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
import java.util.HashSet;
import java.util.Set;
@SuppressWarnings("unused")
public class PetSkillMirror extends Functions implements ScriptFile, EventListener {
private static final Logger _log = LoggerFactory.getLogger(PetSkillMirror.class);
private static final Set<Integer> MIRROR_SKILLS = new HashSet<>();
private static final String EVENT_SUMMON = "onSummonServitor";
@Override
public String[] listeningEventTypes() {
return new String[]{EVENT_SUMMON};
}
@Override
public void onEvent(String eventType, Object... args) {
if (EVENT_SUMMON.equals(eventType) && args.length >= 2) {
if (args[0] instanceof Player player && args[1] instanceof Summon pet) {
syncPetSkills(player, pet);
}
}
}
private void syncPetSkills(Player player, Summon pet) {
boolean changed = false;
for (Integer skillId : MIRROR_SKILLS) {
Skill playerSkill = player.getKnownSkill(skillId);
Skill petSkill = pet.getKnownSkill(skillId);
if (playerSkill != null) {
if (petSkill == null || petSkill.getLevel() < playerSkill.getLevel()) {
pet.addSkill(playerSkill);
changed = true;
}
} else if (petSkill != null) {
pet.removeSkill(petSkill);
changed = true;
}
}
if (changed) {
pet.updateStats();
pet.setCurrentHp(pet.getMaxHp(), false);
pet.setCurrentMp(pet.getMaxMp());
pet.sendPetInfo();
pet.broadcastStatusUpdate();
player.sendMessage("Умения вашего питомца синхронизированы, показатели восстановлены.");
}
}
@Override
public void onLoad() {
loadConfig();
GameServer.getInstance().getListeners().addEventListener(this);
}
private void loadConfig() {
MIRROR_SKILLS.clear();
File file = new File("data/PetSkillMirror.xml");
if (!file.exists()) return;
try {
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file);
NodeList list = doc.getElementsByTagName("skill");
for (int i = 0; i < list.getLength(); i++) {
Node n = list.item(i);
if (n.hasAttributes()) {
Node idAttr = n.getAttributes().getNamedItem("id");
if (idAttr != null) {
try {
MIRROR_SKILLS.add(Integer.parseInt(idAttr.getNodeValue()));
} catch (NumberFormatException ignored) {}
}
}
}
} catch (Exception e) {
_log.error("PetSkillMirror error", e);
}
}
@Override public void onReload() {}
@Override public void onShutdown() {}
}
[/CODE]
При призыве питомца передаём ему навыки хозяина из указанного листа, учитывает уровни. Восстанавливает полностью ему HP/MP после передачи.
Legacy (525)
Attachments
Last edited: