1
0
mirror of https://github.com/Rogiel/l2jserver2 synced 2025-12-11 09:42:54 +00:00

NPC Chatting

Signed-off-by: Rogiel <rogiel@rogiel.com>
This commit is contained in:
2011-05-25 02:38:15 -03:00
parent ad6a2e89d2
commit 7033518023
21 changed files with 613 additions and 75 deletions

View File

@@ -16,8 +16,14 @@
*/
package com.l2jserver.model.world.npc.controller;
import java.util.Arrays;
import org.htmlparser.Parser;
import org.htmlparser.util.ParserException;
import com.l2jserver.game.net.Lineage2Connection;
import com.l2jserver.game.net.packet.server.NPCHtmlMessagePacket;
import com.l2jserver.model.template.NPCTemplate;
import com.l2jserver.model.world.L2Character;
import com.l2jserver.model.world.NPC;
import com.l2jserver.util.exception.L2Exception;
@@ -33,7 +39,25 @@ public class AbstractNPCController implements NPCController {
@Override
public void action(NPC npc, Lineage2Connection conn, L2Character character,
String... args) throws L2Exception {
if (args.length == 2) {
if (args[0].equals("Chat")) {
talk(npc, conn, character,
Arrays.copyOfRange(args, 1, args.length));
return;
}
} else if (args.length == 0 || args.length == 1) {
talk(npc, conn, character, new String[0]);
return;
} else {
final HtmlTemplate template = new HtmlTemplate() {
@Override
protected void build(MarkupTag body) {
body.text("Sorry ${name}, but you cannot interact with me yet!");
}
}.register("name", character.getName());
conn.write(new NPCHtmlMessagePacket(npc, template));
}
conn.sendActionFailed();
}
/**
@@ -51,15 +75,43 @@ public class AbstractNPCController implements NPCController {
*/
protected void talk(NPC npc, Lineage2Connection conn,
L2Character character, String... args) throws L2Exception {
// not yet available message
final HtmlTemplate template = new HtmlTemplate() {
@Override
protected void build(MarkupTag body) {
body.text("Sorry, but I'm not implemented yet!");
}
};
conn.write(new NPCHtmlMessagePacket(npc, template));
String id = null;
if (args.length >= 1) {
id = args[0];
}
conn.write(new NPCHtmlMessagePacket(npc, getHTML(npc, id)));
conn.sendActionFailed();
}
/**
* Returns the NPC HTML message
*
* @param npc
* the npc
* @param id
* the html message id
* @return the html code
*/
protected String getHTML(NPC npc, String id) {
final NPCTemplate template = npc.getTemplate();
// TODO use an decent template engine
return template.getHTML(id).replaceAll("%objectId%",
npc.getID().getID().toString());
}
/**
* This method will try to remove empty lines and all unnecessary space from
* the HTML code.
*
* @param html
* the html code
* @return the trimmed html code
*/
protected String trimHTML(String html) {
try {
return new Parser(html).elements().nextNode().toHtml();
} catch (ParserException e) {
return html;
}
}
}

View File

@@ -16,8 +16,20 @@
*/
package com.l2jserver.model.world.npc.controller;
import java.util.List;
import com.google.inject.Inject;
import com.l2jserver.game.net.Lineage2Connection;
import com.l2jserver.game.net.packet.server.NPCHtmlMessagePacket;
import com.l2jserver.model.id.template.provider.TeleportationTemplateIDProvider;
import com.l2jserver.model.template.NPCTemplate.TeleportRegion;
import com.l2jserver.model.template.TeleportationTemplate;
import com.l2jserver.model.world.L2Character;
import com.l2jserver.model.world.NPC;
import com.l2jserver.service.game.spawn.SpawnService;
import com.l2jserver.util.exception.L2Exception;
import com.l2jserver.util.html.markup.HtmlTemplate;
import com.l2jserver.util.html.markup.MarkupTag;
/**
* This controller is used to control teleporters (e.g. gatekeepers)
@@ -30,5 +42,49 @@ public class TeleporterController extends AbstractNPCController {
*/
@Inject
protected SpawnService spawnService;
@Inject
protected TeleportationTemplateIDProvider teleportationIdProvider;
@Override
public void action(NPC npc, Lineage2Connection conn, L2Character character,
String... args) throws L2Exception {
if (args.length >= 2) {
if (args[0].equals("TeleportList")) {
final List<TeleportRegion> regions = getTeleportRegions(npc,
args[1]);
final HtmlTemplate template = new HtmlTemplate() {
@Override
protected void build(MarkupTag body) {
body.textcode(556);
for (final TeleportRegion region : regions) {
body.addLink(
region.getID().getTemplate().getName()
+ " - "
+ region.getPrice()
+ " "
+ region.getItem().getTemplate()
.getName(),
"Teleport " + region.getID().getID()).br();
}
}
};
conn.write(new NPCHtmlMessagePacket(npc, template));
} else if (args[0].equals("Teleport")) {
final TeleportationTemplate tele = teleportationIdProvider
.createID(args[1]).getTemplate();
if (tele == null) {
// TODO chat
conn.sendActionFailed();
return;
} else {
spawnService.teleport(character, tele.getCoordinate());
}
}
}
super.action(npc, conn, character, args);
}
protected List<TeleportRegion> getTeleportRegions(NPC npc, String id) {
return npc.getTemplate().getTeleportRegions(id);
}
}