📄 c_npcaction.java
字号:
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*
* http://www.gnu.org/copyleft/gpl.html
*/
package l1j.server.server.clientpackets;
import java.util.Calendar;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.Random;
import java.util.StringTokenizer;
import java.util.TimeZone;
import l1j.server.Config;
import l1j.server.server.ClientThread;
import l1j.server.server.GMCommands;
import l1j.server.server.WarTimeController;
import l1j.server.server.datatables.CastleTable;
import l1j.server.server.datatables.DoorSpawnTable;
import l1j.server.server.datatables.HouseTable;
import l1j.server.server.datatables.ItemTable;
import l1j.server.server.datatables.NpcActionTable;
import l1j.server.server.datatables.NpcTable;
import l1j.server.server.datatables.SkillsTable;
import l1j.server.server.datatables.TownTable;
import l1j.server.server.datatables.UBTable;
import l1j.server.server.model.L1CastleLocation;
import l1j.server.server.model.L1Character;
import l1j.server.server.model.L1Clan;
import l1j.server.server.model.L1HauntedHouse;
import l1j.server.server.model.L1HouseLocation;
import l1j.server.server.model.L1Location;
import l1j.server.server.model.L1Object;
import l1j.server.server.model.L1PcInventory;
import l1j.server.server.model.L1PetMatch;
import l1j.server.server.model.L1PolyMorph;
import l1j.server.server.model.L1Quest;
import l1j.server.server.model.L1Teleport;
import l1j.server.server.model.L1TownLocation;
import l1j.server.server.model.L1UltimateBattle;
import l1j.server.server.model.L1World;
import l1j.server.server.model.Instance.L1DoorInstance;
import l1j.server.server.model.Instance.L1HousekeeperInstance;
import l1j.server.server.model.Instance.L1ItemInstance;
import l1j.server.server.model.Instance.L1MerchantInstance;
import l1j.server.server.model.Instance.L1NpcInstance;
import l1j.server.server.model.Instance.L1PcInstance;
import l1j.server.server.model.Instance.L1PetInstance;
import l1j.server.server.model.Instance.L1SummonInstance;
import l1j.server.server.model.item.L1ItemId;
import l1j.server.server.model.npc.L1NpcHtml;
import l1j.server.server.model.npc.action.L1NpcAction;
import l1j.server.server.model.skill.L1SkillId;
import l1j.server.server.model.skill.L1SkillUse;
import l1j.server.server.serverpackets.S_ApplyAuction;
import l1j.server.server.serverpackets.S_AuctionBoardRead;
import l1j.server.server.serverpackets.S_CharReset;
import l1j.server.server.serverpackets.S_CloseList;
import l1j.server.server.serverpackets.S_DelSkill;
import l1j.server.server.serverpackets.S_Deposit;
import l1j.server.server.serverpackets.S_Drawal;
import l1j.server.server.serverpackets.S_HouseMap;
import l1j.server.server.serverpackets.S_HPUpdate;
import l1j.server.server.serverpackets.S_MPUpdate;
import l1j.server.server.serverpackets.S_Message_YN;
import l1j.server.server.serverpackets.S_NPCTalkReturn;
import l1j.server.server.serverpackets.S_PetList;
import l1j.server.server.serverpackets.S_RetrieveList;
import l1j.server.server.serverpackets.S_RetrieveElfList;
import l1j.server.server.serverpackets.S_RetrievePledgeList;
import l1j.server.server.serverpackets.S_SelectTarget;
import l1j.server.server.serverpackets.S_SellHouse;
import l1j.server.server.serverpackets.S_ServerMessage;
import l1j.server.server.serverpackets.S_ShopBuyList;
import l1j.server.server.serverpackets.S_ShopSellList;
import l1j.server.server.serverpackets.S_SkillHaste;
import l1j.server.server.serverpackets.S_SkillIconGFX;
import l1j.server.server.serverpackets.S_SkillIconBlessOfEva;
import l1j.server.server.serverpackets.S_SkillSound;
import l1j.server.server.serverpackets.S_TaxRate;
import l1j.server.server.templates.L1Castle;
import l1j.server.server.templates.L1House;
import l1j.server.server.templates.L1Item;
import l1j.server.server.templates.L1Npc;
import l1j.server.server.templates.L1Skills;
import l1j.server.server.templates.L1Town;
import static l1j.server.server.model.skill.L1SkillId.*;
public class C_NPCAction extends ClientBasePacket {
private static final String C_NPC_ACTION = "[C] C_NPCAction";
private static Logger _log = Logger
.getLogger(C_NPCAction.class
.getName());
private static Random _random = new Random();
public C_NPCAction(byte abyte0[], ClientThread client) throws Exception {
super(abyte0);
int objid = readD();
String s = readS();
String s2 = null;
if (s.equalsIgnoreCase("select") // 競売掲示板のリストを選択
|| s.equalsIgnoreCase("map") // アジトの位置を確かめる
|| s.equalsIgnoreCase("apply")) { // 競売に参加する
s2 = readS();
} else if (s.equalsIgnoreCase("ent")) {
L1Object obj = L1World.getInstance().findObject(objid);
if (obj != null && obj instanceof L1NpcInstance) {
if (((L1NpcInstance) obj).getNpcTemplate().get_npcId() == 80088) {
s2 = readS();
}
}
}
int[] materials = null;
int[] counts = null;
int[] createitem = null;
int[] createcount = null;
String htmlid = null;
String success_htmlid = null;
String failure_htmlid = null;
String[] htmldata = null;
L1PcInstance pc = client.getActiveChar();
L1PcInstance target;
L1Object obj = L1World.getInstance().findObject(objid);
//加入GM HTML
//GM指令
try{
StringTokenizer st = new StringTokenizer(s);
int count=st.countTokens();
if(st.countTokens()!=0){
String s_com = st.nextToken();
if(s_com.equalsIgnoreCase("gmcommand")){
GMCommands command = GMCommands.getInstance();
String cmdLine="";
boolean tf = false;
for(int i=1;i<count;i++){
String temp = st.nextToken();
cmdLine=cmdLine+temp+" ";
tf=true;
}
if(tf)
command.handleCommands(pc, cmdLine);
}
}
}catch(Exception e){
l1j.eric.gui.J_Main.getInstance().addConsolPost("GM 功能選單 error!");
}
//~GM指令
//~加入GM HTML
if (obj != null) {
if (obj instanceof L1NpcInstance) {
L1NpcInstance npc = (L1NpcInstance) obj;
int difflocx = Math.abs(pc.getX() - npc.getX());
int difflocy = Math.abs(pc.getY() - npc.getY());
// 3マス以上離れた場合アクション無效
if (difflocx > 3 || difflocy > 3) {
return;
}
npc.onFinalAction(pc, s);
} else if (obj instanceof L1PcInstance) {
target = (L1PcInstance) obj;
if (s.matches("[0-9]+")) {
summonMonster(target, s);
} else {
L1PolyMorph.handleCommands(target, s);
}
return;
}
} else {
// _log.warning("object not found, oid " + i);
}
// XML化されたアクション
L1NpcAction action = NpcActionTable.getInstance().get(s, pc, obj);
if (action != null) {
L1NpcHtml result = action.execute(s, pc, obj, readByte());
if (result != null) {
pc.sendPackets(new S_NPCTalkReturn(obj.getId(), result));
}
return;
}
/*
* アクション個別処理
*/
if (s.equalsIgnoreCase("buy")) {
L1NpcInstance npc = (L1NpcInstance) obj;
// "sell"のみ表示されるはずのNPCをチェックする。
if (isNpcSellOnly(npc)) {
return;
}
// 販売リスト表示
pc.sendPackets(new S_ShopSellList(objid));
} else if (s.equalsIgnoreCase("sell")) {
int npcid = ((L1NpcInstance) obj).getNpcTemplate().get_npcId();
if (npcid == 70523 || npcid == 70805) { // ラダー or ジュリー
htmlid = "ladar2";
} else if (npcid == 70537 || npcid == 70807) { // ファーリン or フィン
htmlid = "farlin2";
} else if (npcid == 70525 || npcid == 70804) { // ライアン or ジョエル
htmlid = "lien2";
} else if (npcid == 50527 || npcid == 50505 || npcid == 50519
|| npcid == 50545 || npcid == 50531 || npcid == 50529
|| npcid == 50516 || npcid == 50538 || npcid == 50518
|| npcid == 50509 || npcid == 50536 || npcid == 50520
|| npcid == 50543 || npcid == 50526 || npcid == 50512
|| npcid == 50510 || npcid == 50504 || npcid == 50525
|| npcid == 50534 || npcid == 50540 || npcid == 50515
|| npcid == 50513 || npcid == 50528 || npcid == 50533
|| npcid == 50542 || npcid == 50511 || npcid == 50501
|| npcid == 50503 || npcid == 50508 || npcid == 50514
|| npcid == 50532 || npcid == 50544 || npcid == 50524
|| npcid == 50535 || npcid == 50521 || npcid == 50517
|| npcid == 50537 || npcid == 50539 || npcid == 50507
|| npcid == 50530 || npcid == 50502 || npcid == 50506
|| npcid == 50522 || npcid == 50541 || npcid == 50523
|| npcid == 50620 || npcid == 50623 || npcid == 50619
|| npcid == 50621 || npcid == 50622 || npcid == 50624
|| npcid == 50617 || npcid == 50614 || npcid == 50618
|| npcid == 50616 || npcid == 50615 || npcid == 50626
|| npcid == 50627 || npcid == 50628 || npcid == 50629
|| npcid == 50630 || npcid == 50631) { // アジトのNPC
String sellHouseMessage = sellHouse(pc, objid, npcid);
if (sellHouseMessage != null) {
htmlid = sellHouseMessage;
}
} else { // 一般商人
// 買い取りリスト表示
pc.sendPackets(new S_ShopBuyList(objid, pc));
}
} else if (s.equalsIgnoreCase("retrieve")) { // 「個人倉庫:アイテムを受け取る」
if (pc.getLevel() >= 5) {
pc.sendPackets(new S_RetrieveList(objid, pc));
}
} else if (s.equalsIgnoreCase("retrieve-elven")) { // 「エルフ倉庫:荷物を受け取る」
if (pc.getLevel() >= 5 && pc.isElf()) {
pc.sendPackets(new S_RetrieveElfList(objid, pc));
}
} else if (s.equalsIgnoreCase("retrieve-pledge")) { // 「血盟倉庫:荷物を受け取る」
if (pc.getLevel() >= 5) {
if (pc.getClanid() == 0) {
// \f1血盟倉庫を使用するには血盟に加入していなくてはなりません。
pc.sendPackets(new S_ServerMessage(208));
return;
}
int rank = pc.getClanRank();
if (rank != L1Clan.CLAN_RANK_PUBLIC
&& rank != L1Clan.CLAN_RANK_GUARDIAN
&& rank != L1Clan.CLAN_RANK_PRINCE) {
// タイトルのない血盟員もしくは、見習い血盟員の場合は、血盟倉庫を利用することはできません。
pc.sendPackets(new S_ServerMessage(728));
return;
}
if (rank != L1Clan.CLAN_RANK_PRINCE
&& pc.getTitle().equalsIgnoreCase("")) {
// タイトルのない血盟員もしくは、見習い血盟員の場合は、血盟倉庫を利用することはできません。
pc.sendPackets(new S_ServerMessage(728));
return;
}
pc.sendPackets(new S_RetrievePledgeList(objid, pc));
}
} else if (s.equalsIgnoreCase("get")) {
L1NpcInstance npc = (L1NpcInstance) obj;
int npcId = npc.getNpcTemplate().get_npcId();
// クーパー or ダンハム
if (npcId == 70099 || npcId == 70796) {
L1ItemInstance item = pc.getInventory().storeItem(20081, 1); // オイルスキンマント
String npcName = npc.getNpcTemplate().get_name();
String itemName = item.getItem().getName();
pc.sendPackets(new S_ServerMessage(143, npcName, itemName)); // \f1%0が%1をくれました。
pc.getQuest().set_end(L1Quest.QUEST_OILSKINMANT);
htmlid = ""; // ウィンドウを消す
}
// タウンマスター:報酬をもらう
else if (npcId == 70528 || npcId == 70546 || npcId == 70567
|| npcId == 70594 || npcId == 70654 || npcId == 70748
|| npcId == 70774 || npcId == 70799 || npcId == 70815
|| npcId == 70860) {
if (pc.getHomeTownId() > 0) {
} else {
}
}
} else if (s.equalsIgnoreCase("fix")) { // 武器を修理する
} else if (s.equalsIgnoreCase("room")) { // 部屋を借りる
} else if (s.equalsIgnoreCase("hall")
&& obj instanceof L1MerchantInstance) { // ホールを借りる
} else if (s.equalsIgnoreCase("return")) { // 部屋ホールを返す
} else if (s.equalsIgnoreCase("enter")) { // 部屋ホールに入る
} else if (s.equalsIgnoreCase("openigate")) { // ゲートキーパー / 城門を開ける
L1NpcInstance npc = (L1NpcInstance) obj;
openCloseGate(pc, npc.getNpcTemplate().get_npcId(), true);
htmlid = ""; // ウィンドウを消す
} else if (s.equalsIgnoreCase("closeigate")) { // ゲートキーパー / 城門を閉める
L1NpcInstance npc = (L1NpcInstance) obj;
openCloseGate(pc, npc.getNpcTemplate().get_npcId(), false);
htmlid = ""; // ウィンドウを消す
} else if (s.equalsIgnoreCase("askwartime")) { // 近衛兵 / 次の攻城戦いの時間をたずねる
L1NpcInstance npc = (L1NpcInstance) obj;
if (npc.getNpcTemplate().get_npcId() == 60514) { // ケント城近衛兵
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -