Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
ERROR threading.RunnableImpl: Exception: RunnableImpl.run():
#1
перенес квест и чтото еще надо либо переписать либо добавит но не могу понять что упустил вот ошибка:
PHP код:
<?php 
[05.07.12 20:16:54:755] INFO instancemanager.SpawnManager: SpawnManager: spawned 1000 npc for group: NONE
[05.07.12 20:16:55:173] INFO instancemanager.SpawnManager: SpawnManager: spawned 2000 npc for group: NONE
[05.07.12 20:16:55:507] INFO instancemanager.SpawnManager: SpawnManager: spawned 3000 npc for group: NONE
[05.07.12 20:16:55:519] ERROR threading.RunnableImpl: Exception: RunnableImpl.run(): java.lang.NullPointerException
java
.lang.NullPointerException
at ai
.groups.TalkinIslandGuides.config(TalkinIslandGuides.java:202)
at ai.groups.TalkinIslandGuides.thinkActive(TalkinIslandGuides.java:250)
at l2p.gameserver.ai.DefaultAI.onEvtThink(DefaultAI.java:861)
at l2p.gameserver.ai.DefaultAI.onIntentionActive(DefaultAI.java:514)
at l2p.gameserver.ai.AbstractAI.setIntention(AbstractAI.java:72)
at l2p.gameserver.ai.AbstractAI.setIntention(AbstractAI.java:41)
at l2p.gameserver.ai.DefaultAI.onEvtSpawn(DefaultAI.java:613)
at l2p.gameserver.ai.AbstractAI.notifyEvent(AbstractAI.java:168)
at l2p.gameserver.ai.AbstractAI.notifyEvent(AbstractAI.java:110)
at l2p.gameserver.model.GameObjectTasks$NotifyAITask.runImpl(GameObjectTasks.java:431)
at l2p.commons.threading.RunnableImpl.run(RunnableImpl.java:21)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
[
05.07.12 20:16:55:556] ERROR threading.RunnableImpl: Exception: RunnableImpl.run(): java.lang.NullPointerException
java
.lang.NullPointerException
at ai
.groups.TalkinIslandGuides.config(TalkinIslandGuides.java:202)
at ai.groups.TalkinIslandGuides.thinkActive(TalkinIslandGuides.java:250)
at l2p.gameserver.ai.DefaultAI.onEvtThink(DefaultAI.java:861)
at l2p.gameserver.ai.DefaultAI.onIntentionActive(DefaultAI.java:514)
at l2p.gameserver.ai.AbstractAI.setIntention(AbstractAI.java:72)
at l2p.gameserver.ai.AbstractAI.setIntention(AbstractAI.java:41)
at l2p.gameserver.ai.DefaultAI.onEvtSpawn(DefaultAI.java:613)
at l2p.gameserver.ai.AbstractAI.notifyEvent(AbstractAI.java:168)
at l2p.gameserver.ai.AbstractAI.notifyEvent(AbstractAI.java:110)
at l2p.gameserver.model.GameObjectTasks$NotifyAITask.runImpl(GameObjectTasks.java:431)
at l2p.commons.threading.RunnableImpl.run(RunnableImpl.java:21)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
[
05.07.12 20:16:55:571] ERROR threading.RunnableImpl: Exception: RunnableImpl.run(): java.lang.NullPointerException
java
.lang.NullPointerException
at ai
.groups.TalkinIslandGuides.config(TalkinIslandGuides.java:202)
at ai.groups.TalkinIslandGuides.thinkActive(TalkinIslandGuides.java:250)
at l2p.gameserver.ai.DefaultAI.onEvtThink(DefaultAI.java:861)
at l2p.gameserver.ai.DefaultAI.onIntentionActive(DefaultAI.java:514)
at l2p.gameserver.ai.AbstractAI.setIntention(AbstractAI.java:72)
at l2p.gameserver.ai.AbstractAI.setIntention(AbstractAI.java:41)
at l2p.gameserver.ai.DefaultAI.onEvtSpawn(DefaultAI.java:613)
at l2p.gameserver.ai.AbstractAI.notifyEvent(AbstractAI.java:168)
at l2p.gameserver.ai.AbstractAI.notifyEvent(AbstractAI.java:110)
at l2p.gameserver.model.GameObjectTasks$NotifyAITask.runImpl(GameObjectTasks.java:431)
at l2p.commons.threading.RunnableImpl.run(RunnableImpl.java:21)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
[
05.07.12 20:16:55:578] ERROR threading.RunnableImpl: Exception: RunnableImpl.run(): java.lang.NullPointerException
java
.lang.NullPointerException
at ai
.groups.TalkinIslandGuides.config(TalkinIslandGuides.java:202)
at ai.groups.TalkinIslandGuides.thinkActive(TalkinIslandGuides.java:250)
at l2p.gameserver.ai.DefaultAI.onEvtThink(DefaultAI.java:861)
at l2p.gameserver.ai.DefaultAI.onIntentionActive(DefaultAI.java:514)
at l2p.gameserver.ai.AbstractAI.setIntention(AbstractAI.java:72)
at l2p.gameserver.ai.AbstractAI.setIntention(AbstractAI.java:41)
at l2p.gameserver.ai.DefaultAI.onEvtSpawn(DefaultAI.java:613)
at l2p.gameserver.ai.AbstractAI.notifyEvent(AbstractAI.java:168)
at l2p.gameserver.ai.AbstractAI.notifyEvent(AbstractAI.java:110)
at l2p.gameserver.model.GameObjectTasks$NotifyAITask.runImpl(GameObjectTasks.java:431)
at l2p.commons.threading.RunnableImpl.run(RunnableImpl.java:21)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
Она появляется после добавления файла :
PHP код:
<?php 
package ai
.groups;

import l2p.commons.util.Rnd;
import l2p.gameserver.ai.DefaultAI;
import l2p.gameserver.model.Creature;
import l2p.gameserver.model.Player;
import l2p.gameserver.model.instances.NpcInstance;
import l2p.gameserver.scripts.Functions;
import l2p.gameserver.network.serverpackets.ExRotation;
import l2p.gameserver.network.serverpackets.components.ChatType;

import quests._10365_SeekerEscort;

public class
TalkinIslandGuides extends DefaultAI implements OnTeleportListener
{
private final static
int SEARCHING_MYST_POWER_SOLDIER = 33014;
private final static
int GOING_INTO_REAL_WAR_SOLDIER = 33016;
private final static
int BACKUP_SEEKERS_ASSASSIN = 33204;
private final static
int SEEKER_ESCORT_BLOODHOUND = 32988;

private final static
NpcString SEARCHING_MYST_POWER_STRING = NpcString.COME_FOLLOW_ME;
private final static
NpcString GOING_INTO_REAL_WAR_STRING = NpcString.COME_FOLLOW_ME;
private final static
NpcString BACKUP_SEEKERS_STRING = NpcString.HEY_KID_HARRY_UP_AND_FOLLOW_ME;
private final static
NpcString SEEKER_ESCORT_BLOODHOUND_STRING = NpcString.CATCH_UP_TO_KING_HE_IS_WAITING;
private final static
NpcString SEEKER_ESCORT_TELETO_STRING = NpcString.YOU_MUST_MOVE_TO_EXPLORATION_AREA5_IN_ORDER_TO_CONTINUE;
private final static
NpcString SEEKER_ESCORT_FAIL = NpcString.KING_HAS_RETURNED_TO_DEF_RETURN_TO_DEF_AND_START_AGAIN;

/**
* "Searching for the Mysterious Power" soldier coords
*/
private final static int[][] SMP_COORDS = {
{-
111416, 255864, -1469},
{-
111915, 255335, -1432},
{-
112271, 254838, -1504},
{-
112209, 254385, -1504},
{-
111527, 254007, -1696},
{-
110773, 253754, -1784}
};
/**
* In "Going into the Real War" quest guides can move by left or by right side.
* Side is choosen by distance between player location and first coord in set.
*/
private final static int[][] GRW_COORDS_LEFT = {
{-
110885, 253533, -1776},
{-
111050, 253183, -1776},
{-
111007, 252706, -1832},
{-
110957, 252400, -1928},
{-
110643, 252365, -1976}
};
private final static
int[][] GRW_COORDS_RIGHT = {
{-
110618, 253655, -1792},
{-
110296, 253160, -1848},
{-
110271, 253163, -1816},
{-
110156, 252874, -1888},
{-
110206, 252422, -1984}
};

/**
* "Backup Seekers" assassin coords
*/
private final static int[][] BS_COORDS = {
{-
117996, 255845, -1320},
{-
117103, 255538, -1296},
{-
115719, 254792, -1504},
{-
114695, 254741, -1528},
{-
114589, 253517, -1528}
};

/**
* "Seeker Escort" bloodhound coords
*/
private final static int[][] SE_COORDS = {
{-
110628, 238359, -2920},
{-
110581, 238930, -2920},
{-
110711, 239262, -2920},
{-
110958, 239505, -2920},
{-
111022, 239669, -2920},
{-
110989, 239911, -2920},
{-
110780, 240165, -2920},
{-
110790, 240522, -2920},
{-
110999, 240602, -2920},
{-
111297, 240382, -2920},
{-
111642, 239879, -2920},
{-
111975, 239699, -2920},
{-
112280, 239783, -2920},
{-
112645, 239914, -2920},
{-
112705, 240236, -2920},
{-
112483, 240516, -2920},
{-
112126, 240498, -2920},
{-
112027, 240300, -2920},
{-
112228, 240123, -2920},
};
/**
* Into 5th exploration zone for Bloodhound
*/
private final static int[][] SE_COORDS2 = {
{-
111066, 233798, -3200},
{-
112436, 233701, -3096},
{-
112182, 233490, -3120},
{-
112124, 233130, -3136},
{-
112389, 232931, -3096},
{-
112689, 232566, -3072},
{-
112716, 232359, -3072},
{-
112533, 232054, -3080},
{-
112308, 232084, -3104},
{-
112071, 232359, -3136},
{-
111766, 232566, -3160},
{-
111219, 232723, -3224},
{-
110813, 232482, -3256},
{-
110764, 232124, -3256},
{-
111152, 231842, -3224},
{-
111472, 231976, -3200},
{-
111666, 231951, -3168},
{-
111723, 231830, -3168}
};

private
NpcString currentString = null;
private
int[][] currentCoords = {};
/**
* This npc state identifies what coords to use
*/
private int currentState;
/**
* If true, creature will be despawned when user reaches last loc
*/
private boolean autounspawn = true;
/**
* If is NPC_SAY, then NPC will "say words", if is SCREEN, then message will appear on center screen
*/
private String displayMessageType = "NPC_SAY";
/**
* When last message was sent?
*/
private long lastMessage = 0;
/**
* When last player was around NPC
*/
private long lastVisit = 0;
private
boolean configured = false;
/**
* How many set of coords was covered by NPC
*/
private int coordsCovered = 0;

public
TalkinIslandGuides(NpcInstance actor)
{
super(actor);
currentState = 0;
}

@
Override
protected void finalize() throws Throwable
{
super.finalize();
NpcInstance actor = getActor();
if (
actor != null)
{
Creature target = actor.getFollowTarget();
if (
target != null)
target.removeListener(this);
}
}

@
Override
public void onTeleport(Player player, int x, int y, int z, Reflection reflection)
{
// Yes, we approve any teleportation action from player.
// Btw, is very small chance that player will use another teleport than 5th Exploration Area.
playerTeleported();
Creature target = getActor().getFollowTarget();
if (
target != null)
target.removeListener(this);
}

/**
* This is used to detect what coods/message should be used.
*/
private void config()
{
if (
configured)
return;

configured = true;

NpcInstance actor = getActor();
Creature target = actor.getFollowTarget();

if (
target == null)
{
stopAITask();
actor.deleteMe();
}

target.addListener(this);

int npcId = actor.getNpcId();
// Select coords
switch (npcId)
{
case
SEARCHING_MYST_POWER_SOLDIER:
currentCoords = SMP_COORDS;
currentString = SEARCHING_MYST_POWER_STRING;
break;
case
BACKUP_SEEKERS_ASSASSIN:
currentCoords = BS_COORDS;
currentString = BACKUP_SEEKERS_STRING;
break;
case
GOING_INTO_REAL_WAR_SOLDIER:
double distLeft = target.getDistance(GRW_COORDS_LEFT[0][0], GRW_COORDS_LEFT[0][1], GRW_COORDS_LEFT[0][2]);
double distRight = target.getDistance(GRW_COORDS_RIGHT[0][0], GRW_COORDS_RIGHT[0][1], GRW_COORDS_RIGHT[0][2]);
if (
distLeft <= distRight)
currentCoords = GRW_COORDS_LEFT;
else
currentCoords = GRW_COORDS_RIGHT;
currentString = GOING_INTO_REAL_WAR_STRING;
break;
case
SEEKER_ESCORT_BLOODHOUND:
currentCoords = SE_COORDS;
currentString = SEEKER_ESCORT_BLOODHOUND_STRING;
autounspawn = false;
displayMessageType = "SCREEN";
actor.setTitle(target.getName());
break;
default:
break;
}
}

@
Override
protected boolean thinkActive()
{
NpcInstance actor = getActor();
Creature target = actor.getFollowTarget();
int npcId = actor.getNpcId();

if (
target == null)
{
stopAITask();
actor.deleteMe();
}

config();

// This NPC is running
actor.setRunning();
if (
actor.getDistance(target) < 200 || currentState == 0)
{
lastVisit = System.currentTimeMillis();
if (
currentState == 0)
++
coordsCovered;
if (
currentState < currentCoords.length)
{
actor.moveToLocation(currentCoords[currentState][0], currentCoords[currentState][1], currentCoords[currentState][2], Rnd.get(0, 50), true);
if (
actor.getDestination() == null)
{
// TODO: We need to set heading to turn NPC to player. Seems this is not work properly
actor.setHeading(target.getHeading());
++
currentState;
}
}
else
{
if (
autounspawn)
actor.deleteMe();

currentString = SEEKER_ESCORT_TELETO_STRING;
switch (
npcId)
{
case
SEEKER_ESCORT_BLOODHOUND:
if (
coordsCovered >= 2)
{
// Yeah, this is awesome >_< Very bad to set quest states from another classes, but we need that.
QuestState st = target.getPlayer().getQuestState(_10365_SeekerEscort.class);
if (
st != null)
((
_10365_SeekerEscort)st.getQuest()).bloodhoundEscorted(st);
}
break;
}
}
}
else
{
// Remove NPC if player not visit it during 1 minute
if (System.currentTimeMillis() - lastVisit > 60000)
{
switch (
npcId)
{
case
SEEKER_ESCORT_BLOODHOUND:
sendMessage(SEEKER_ESCORT_FAIL);
break;
}
stopAITask();
actor.deleteMe();
}
// Don't spam messages
if (System.currentTimeMillis() - lastMessage > 2000)
{
sendMessage(currentString);
lastMessage = System.currentTimeMillis();
}
}

return
true;
}

private
void sendMessage(NpcString message)
{
NpcInstance actor = getActor();
Creature target = actor.getFollowTarget();

if (
displayMessageType.equals("NPC_SAY"))
actor.broadcastPacket(new NpcSay(actor, ChatType.ALL, message, target.getName()));
else if (
displayMessageType.equals("SCREEN"))
target.sendPacket(new ExShowScreenMessage(message, 2000, ExShowScreenMessage.ScreenMessageAlign.TOP_CENTER));
}

public
void playerTeleported()
{
/**
* TODO: We need teleport player to another location.
* This is strange, but player teleported not to the current 5th area location.
* He's teleported to upstair, neer teleporter.
*/
int npcId = getActor().getNpcId();
switch (
npcId)
{
case
SEEKER_ESCORT_BLOODHOUND:
if (
coordsCovered >= 1)
{
currentCoords = SE_COORDS2;
currentString = SEEKER_ESCORT_BLOODHOUND_STRING;
currentState = 0;
autounspawn = true;
getActor().teleToLocation(new Location(SE_COORDS2[0][0], SE_COORDS2[0][1], SE_COORDS2[0][2]));
}
break;
}
}

/**
* These NPC does not have random walk
*/
@Override
protected boolean randomWalk()
{
return
false;
}
}
в итоге квест на половину работает получаеш квест появляется ищейка но она стоит на месте вмето того чтобы идти к порту в руину 5ур

Добавлено через 44 минуты
как только вписываю в НПС name="ai_type" value="groups.TalkinIslandGuides" вмемто name="ai_type" value="groups.CharacterAI" ошибка опявляестя меняю на CharacterAI ошибка пропадает вот НПС:
PHP код:
<?php 
<npc id="32988" name="Bloodhound" title="">
<!--
TODO: NEW NPC (AUTOGENERATED!) -->
<
set name="aggroRange" value="0" />
<
set name="ai_type" value="groups.TalkinIslandGuides" />
<
set name="baseAtkRange" value="40" />
<
set name="baseCON" value="43" />
<
set name="baseCritRate" value="4" />
<
set name="baseDEX" value="30" />
<
set name="baseHpMax" value="680" />
<
set name="baseHpRate" value="1" />
<
set name="baseHpReg" value="7.500" />
<
set name="baseINT" value="21" />
<
set name="baseMAtk" value="6" />
<
set name="baseMAtkSpd" value="398" />
<
set name="baseMDef" value="200000" />
<
set name="baseMEN" value="20" />
<
set name="baseMpMax" value="2000" />
<
set name="baseMpReg" value="2.700" />
<
set name="basePAtk" value="8" />
<
set name="basePAtkSpd" value="299" />
<
set name="basePDef" value="60000" />
<
set name="baseRunSpd" value="120" />
<
set name="baseSTR" value="40" />
<
set name="baseShldDef" value="0" />
<
set name="baseShldRate" value="0" />
<
set name="baseWIT" value="20" />
<
set name="baseWalkSpd" value="8" />
<
set name="collision_height" value="18.50" />
<
set name="collision_radius" value="6.50" />
<
set name="level" value="80" />
<
set name="rewardExp" value="0" />
<
set name="rewardRp" value="0" />
<
set name="rewardSp" value="0" />
<
set name="shots" value="NONE" />
<
set name="texture" value="" />
<
set name="type" value="NpcNotSay" />
</
npc>

Добавлено через 50 минут
Я так понял что фаил не хочет работать совместно с НПС оно почему
Ответ
#2
смотри класс ai.groups.TalkinIslandGuides.config(TalkinIslandGuides.java:202)
Ответ
#3
Darvin Написал:смотри класс ai.groups.TalkinIslandGuides.config(TalkinIslandGuides.java:202)

Выше этот скрипт написан к этим нпс
private final static int SEARCHING_MYST_POWER_SOLDIER = 33014;
private final static int GOING_INTO_REAL_WAR_SOLDIER = 33016;
private final static int BACKUP_SEEKERS_ASSASSIN = 33204;
в параметрах прописываю <set name="ai_type" value="groups.TalkinIslandGuides" /> ошибки нет
а вот к private final static int SEEKER_ESCORT_BLOODHOUND = 32988; сразу шибка вот повторю всеь код:
PHP код:
<?php 
package ai
.groups;

import l2p.commons.util.Rnd;
import l2p.gameserver.ai.DefaultAI;
import l2p.gameserver.model.Creature;
import l2p.gameserver.model.Player;
import l2p.gameserver.model.instances.NpcInstance;
import l2p.gameserver.scripts.Functions;
import l2p.gameserver.network.serverpackets.ExRotation;
import l2p.gameserver.network.serverpackets.components.ChatType;
import l2p.gameserver.network.serverpackets.components.NpcString;
////////////////////////////////////////////////////////////////
import l2p.gameserver.listener.actor.player.OnTeleportListener;
import l2p.gameserver.model.entity.Reflection;
import l2p.gameserver.model.quest.QuestState;
import l2p.gameserver.network.serverpackets.ExShowScreenMessage;
import l2p.gameserver.network.serverpackets.NpcSay;
import l2p.gameserver.utils.Location;
////////////////////////////////////////////////////////////////
import quests._10365_SeekerEscort;

public class
TalkinIslandGuides extends DefaultAI implements OnTeleportListener
{
private final static
int SEARCHING_MYST_POWER_SOLDIER = 33014;
private final static
int GOING_INTO_REAL_WAR_SOLDIER = 33016;
private final static
int BACKUP_SEEKERS_ASSASSIN = 33204;
private final static
int SEEKER_ESCORT_BLOODHOUND = 32988;

private final static
NpcString SEARCHING_MYST_POWER_STRING = NpcString.COME_FOLLOW_ME;
private final static
NpcString GOING_INTO_REAL_WAR_STRING = NpcString.COME_FOLLOW_ME;
private final static
NpcString BACKUP_SEEKERS_STRING = NpcString.HEY_KID_HARRY_UP_AND_FOLLOW_ME;
private final static
NpcString SEEKER_ESCORT_BLOODHOUND_STRING = NpcString.CATCH_UP_TO_KING_HE_IS_WAITING;
private final static
NpcString SEEKER_ESCORT_TELETO_STRING = NpcString.YOU_MUST_MOVE_TO_EXPLORATION_AREA5_IN_ORDER_TO_CONTINUE;
private final static
NpcString SEEKER_ESCORT_FAIL = NpcString.KING_HAS_RETURNED_TO_DEF_RETURN_TO_DEF_AND_START_AGAIN;

/**
* "Searching for the Mysterious Power" soldier coords
*/
private final static int[][] SMP_COORDS = {
{-
111416, 255864, -1469},
{-
111915, 255335, -1432},
{-
112271, 254838, -1504},
{-
112209, 254385, -1504},
{-
111527, 254007, -1696},
{-
110773, 253754, -1784}
};
/**
* In "Going into the Real War" quest guides can move by left or by right side.
* Side is choosen by distance between player location and first coord in set.
*/
private final static int[][] GRW_COORDS_LEFT = {
{-
110885, 253533, -1776},
{-
111050, 253183, -1776},
{-
111007, 252706, -1832},
{-
110957, 252400, -1928},
{-
110643, 252365, -1976}
};
private final static
int[][] GRW_COORDS_RIGHT = {
{-
110618, 253655, -1792},
{-
110296, 253160, -1848},
{-
110271, 253163, -1816},
{-
110156, 252874, -1888},
{-
110206, 252422, -1984}
};

/**
* "Backup Seekers" assassin coords
*/
private final static int[][] BS_COORDS = {
{-
117996, 255845, -1320},
{-
117103, 255538, -1296},
{-
115719, 254792, -1504},
{-
114695, 254741, -1528},
{-
114589, 253517, -1528}
};

/**
* "Seeker Escort" bloodhound coords
*/
private final static int[][] SE_COORDS = {
{-
110628, 238359, -2920},
{-
110581, 238930, -2920},
{-
110711, 239262, -2920},
{-
110958, 239505, -2920},
{-
111022, 239669, -2920},
{-
110989, 239911, -2920},
{-
110780, 240165, -2920},
{-
110790, 240522, -2920},
{-
110999, 240602, -2920},
{-
111297, 240382, -2920},
{-
111642, 239879, -2920},
{-
111975, 239699, -2920},
{-
112280, 239783, -2920},
{-
112645, 239914, -2920},
{-
112705, 240236, -2920},
{-
112483, 240516, -2920},
{-
112126, 240498, -2920},
{-
112027, 240300, -2920},
{-
112228, 240123, -2920},
};
/**
* Into 5th exploration zone for Bloodhound
*/
private final static int[][] SE_COORDS2 = {
{-
111066, 233798, -3200},
{-
112436, 233701, -3096},
{-
112182, 233490, -3120},
{-
112124, 233130, -3136},
{-
112389, 232931, -3096},
{-
112689, 232566, -3072},
{-
112716, 232359, -3072},
{-
112533, 232054, -3080},
{-
112308, 232084, -3104},
{-
112071, 232359, -3136},
{-
111766, 232566, -3160},
{-
111219, 232723, -3224},
{-
110813, 232482, -3256},
{-
110764, 232124, -3256},
{-
111152, 231842, -3224},
{-
111472, 231976, -3200},
{-
111666, 231951, -3168},
{-
111723, 231830, -3168}
};

private
NpcString currentString = null;
private
int[][] currentCoords = {};
/**
* This npc state identifies what coords to use
*/
private int currentState;
/**
* If true, creature will be despawned when user reaches last loc
*/
private boolean autounspawn = true;
/**
* If is NPC_SAY, then NPC will "say words", if is SCREEN, then message will appear on center screen
*/
private String displayMessageType = "NPC_SAY";
/**
* When last message was sent?
*/
private long lastMessage = 0;
/**
* When last player was around NPC
*/
private long lastVisit = 0;
private
boolean configured = false;
/**
* How many set of coords was covered by NPC
*/
private int coordsCovered = 0;

public
TalkinIslandGuides(NpcInstance actor)
{
super(actor);
currentState = 0;
}

@
Override
protected void finalize() throws Throwable
{
super.finalize();
NpcInstance actor = getActor();
if (
actor != null)
{
Creature target = actor.getFollowTarget();
if (
target != null)
target.removeListener(this);
}
}

@
Override
public void onTeleport(Player player, int x, int y, int z, Reflection reflection)
{
// Yes, we approve any teleportation action from player.
// Btw, is very small chance that player will use another teleport than 5th Exploration Area.
playerTeleported();
Creature target = getActor().getFollowTarget();
if (
target != null)
target.removeListener(this);
}

/**
* This is used to detect what coods/message should be used.
*/
private void config()
{
if (
configured)
return;

configured = true;

NpcInstance actor = getActor();
Creature target = actor.getFollowTarget();

if (
target == null)
{
stopAITask();
actor.deleteMe();
}

target.addListener(this);

int npcId = actor.getNpcId();
// Select coords
switch (npcId)
{
case
SEARCHING_MYST_POWER_SOLDIER:
currentCoords = SMP_COORDS;
currentString = SEARCHING_MYST_POWER_STRING;
break;
case
BACKUP_SEEKERS_ASSASSIN:
currentCoords = BS_COORDS;
currentString = BACKUP_SEEKERS_STRING;
break;
case
GOING_INTO_REAL_WAR_SOLDIER:
double distLeft = target.getDistance(GRW_COORDS_LEFT[0][0], GRW_COORDS_LEFT[0][1], GRW_COORDS_LEFT[0][2]);
double distRight = target.getDistance(GRW_COORDS_RIGHT[0][0], GRW_COORDS_RIGHT[0][1], GRW_COORDS_RIGHT[0][2]);
if (
distLeft <= distRight)
currentCoords = GRW_COORDS_LEFT;
else
currentCoords = GRW_COORDS_RIGHT;
currentString = GOING_INTO_REAL_WAR_STRING;
break;
case
SEEKER_ESCORT_BLOODHOUND:
currentCoords = SE_COORDS;
currentString = SEEKER_ESCORT_BLOODHOUND_STRING;
//autounspawn = false;
//displayMessageType = "SCREEN";
//actor.setTitle(target.getName());
break;
default:
break;
}
}

@
Override
protected boolean thinkActive()
{
NpcInstance actor = getActor();
Creature target = actor.getFollowTarget();
int npcId = actor.getNpcId();

if (
target == null)
{
stopAITask();
actor.deleteMe();
}

config();

// This NPC is running
actor.setRunning();
if (
actor.getDistance(target) < 200 || currentState == 0)
{
lastVisit = System.currentTimeMillis();
if (
currentState == 0)
++
coordsCovered;
if (
currentState < currentCoords.length)
{
actor.moveToLocation(currentCoords[currentState][0], currentCoords[currentState][1], currentCoords[currentState][2], Rnd.get(0, 50), true);
if (
actor.getDestination() == null)
{
// TODO: We need to set heading to turn NPC to player. Seems this is not work properly
actor.setHeading(target.getHeading());
++
currentState;
}
}
else
{
if (
autounspawn)
actor.deleteMe();

currentString = SEEKER_ESCORT_TELETO_STRING;
switch (
npcId)
{
case
SEEKER_ESCORT_BLOODHOUND:
if (
coordsCovered >= 2)
{
// Yeah, this is awesome >_< Very bad to set quest states from another classes, but we need that.
QuestState st = target.getPlayer().getQuestState(_10365_SeekerEscort.class);
if (
st != null)
((
_10365_SeekerEscort)st.getQuest()).bloodhoundEscorted(st);
}
break;
}
}
}
else
{
// Remove NPC if player not visit it during 1 minute
if (System.currentTimeMillis() - lastVisit > 60000)
{
switch (
npcId)
{
case
SEEKER_ESCORT_BLOODHOUND:
sendMessage(SEEKER_ESCORT_FAIL);
break;
}
stopAITask();
actor.deleteMe();
}
// Don't spam messages
if (System.currentTimeMillis() - lastMessage > 2000)
{
sendMessage(currentString);
lastMessage = System.currentTimeMillis();
}
}

return
true;
}

private
void sendMessage(NpcString message)
{
NpcInstance actor = getActor();
Creature target = actor.getFollowTarget();

if (
displayMessageType.equals("NPC_SAY"))
actor.broadcastPacket(new NpcSay(actor, ChatType.ALL, message, target.getName()));
else if (
displayMessageType.equals("SCREEN"))
target.sendPacket(new ExShowScreenMessage(message, 2000, ExShowScreenMessage.ScreenMessageAlign.TOP_CENTER));
}

public
void playerTeleported()
{
/**
* TODO: We need teleport player to another location.
* This is strange, but player teleported not to the current 5th area location.
* He's teleported to upstair, neer teleporter.
*/
int npcId = getActor().getNpcId();
switch (
npcId)
{
case
SEEKER_ESCORT_BLOODHOUND:
if (
coordsCovered >= 1)
{
currentCoords = SE_COORDS2;
currentString = SEEKER_ESCORT_BLOODHOUND_STRING;
currentState = 0;
autounspawn = true;
getActor().teleToLocation(new Location(SE_COORDS2[0][0], SE_COORDS2[0][1], SE_COORDS2[0][2]));
}
break;
}
}

/**
* These NPC does not have random walk
*/
@Override
protected boolean randomWalk()
{
return
false;
}
}
Ответ
#4
Код:
if (target == null)
        {
            stopAITask();
            actor.deleteMe();
        }
        
        target.addListener(this);

Если таргет == нуль -> как он пристроит ему слушатель?
Делайте ретурн, и думайте головой Smile
Ответ
#5
всем спасибо разобрался пришлось немного переписать кое что вырезать вот результат
PHP код:
<?php 
package ai
.groups;

import l2p.commons.util.Rnd;
import l2p.gameserver.ai.DefaultAI;
import l2p.gameserver.model.Creature;
import l2p.gameserver.model.Player;
import l2p.gameserver.model.instances.NpcInstance;
import l2p.gameserver.scripts.Functions;
import l2p.gameserver.network.serverpackets.ExRotation;
import l2p.gameserver.network.serverpackets.components.ChatType;
import l2p.gameserver.network.serverpackets.components.NpcString;
////////////////////////////////////////////////////////////////
import l2p.gameserver.listener.actor.player.OnTeleportListener;
import l2p.gameserver.model.entity.Reflection;
import l2p.gameserver.model.quest.QuestState;
import l2p.gameserver.network.serverpackets.ExShowScreenMessage;
import l2p.gameserver.network.serverpackets.NpcSay;
import l2p.gameserver.utils.Location;
////////////////////////////////////////////////////////////////
import quests._10365_SeekerEscort;

public class
TalkinIslandGuides extends DefaultAI implements OnTeleportListener
{
private final static
int SEARCHING_MYST_POWER_SOLDIER = 33014;
private final static
int GOING_INTO_REAL_WAR_SOLDIER = 33016;
private final static
int BACKUP_SEEKERS_ASSASSIN = 33204;
private final static
int SEEKER_ESCORT_BLOODHOUND = 32988;

private final static
NpcString SEARCHING_MYST_POWER_STRING = NpcString.COME_FOLLOW_ME;
private final static
NpcString GOING_INTO_REAL_WAR_STRING = NpcString.COME_FOLLOW_ME;
private final static
NpcString BACKUP_SEEKERS_STRING = NpcString.HEY_KID_HARRY_UP_AND_FOLLOW_ME;
private final static
NpcString SEEKER_ESCORT_BLOODHOUND_STRING = NpcString.CATCH_UP_TO_KING_HE_IS_WAITING;
private final static
NpcString SEEKER_ESCORT_TELETO_STRING = NpcString.YOU_MUST_MOVE_TO_EXPLORATION_AREA5_IN_ORDER_TO_CONTINUE;
private final static
NpcString SEEKER_ESCORT_FAIL = NpcString.KING_HAS_RETURNED_TO_DEF_RETURN_TO_DEF_AND_START_AGAIN;

/**
* "Searching for the Mysterious Power" soldier coords
*/
private final static int[][] SMP_COORDS = {
{-
111416, 255864, -1469},
{-
111915, 255335, -1432},
{-
112271, 254838, -1504},
{-
112209, 254385, -1504},
{-
111527, 254007, -1696},
{-
110773, 253754, -1784}
};
/**
* In "Going into the Real War" quest guides can move by left or by right side.
* Side is choosen by distance between player location and first coord in set.
*/
private final static int[][] GRW_COORDS_LEFT = {
{-
110885, 253533, -1776},
{-
111050, 253183, -1776},
{-
111007, 252706, -1832},
{-
110957, 252400, -1928},
{-
110643, 252365, -1976}
};
private final static
int[][] GRW_COORDS_RIGHT = {
{-
110618, 253655, -1792},
{-
110296, 253160, -1848},
{-
110271, 253163, -1816},
{-
110156, 252874, -1888},
{-
110206, 252422, -1984}
};

/**
* "Backup Seekers" assassin coords
*/
private final static int[][] BS_COORDS = {
{-
117996, 255845, -1320},
{-
117103, 255538, -1296},
{-
115719, 254792, -1504},
{-
114695, 254741, -1528},
{-
114589, 253517, -1528}
};

/**
* "Seeker Escort" bloodhound coords
*/
private final static int[][] SE_COORDS = {
{-
110628, 238359, -2920},
{-
110581, 238930, -2920},
{-
110711, 239262, -2920},
{-
110958, 239505, -2920},
{-
111022, 239669, -2920},
{-
110989, 239911, -2920},
{-
110780, 240165, -2920},
{-
110790, 240522, -2920},
{-
110999, 240602, -2920},
{-
111297, 240382, -2920},
{-
111642, 239879, -2920},
{-
111975, 239699, -2920},
{-
112280, 239783, -2920},
{-
112645, 239914, -2920},
{-
112705, 240236, -2920},
{-
112483, 240516, -2920},
{-
112126, 240498, -2920},
{-
112027, 240300, -2920},
{-
112228, 240123, -2920},
};
/**
* Into 5th exploration zone for Bloodhound
*/
private final static int[][] SE_COORDS2 = {
{-
111066, 233798, -3200},
{-
112436, 233701, -3096},
{-
112182, 233490, -3120},
{-
112124, 233130, -3136},
{-
112389, 232931, -3096},
{-
112689, 232566, -3072},
{-
112716, 232359, -3072},
{-
112533, 232054, -3080},
{-
112308, 232084, -3104},
{-
112071, 232359, -3136},
{-
111766, 232566, -3160},
{-
111219, 232723, -3224},
{-
110813, 232482, -3256},
{-
110764, 232124, -3256},
{-
111152, 231842, -3224},
{-
111472, 231976, -3200},
{-
111666, 231951, -3168},
{-
111723, 231830, -3168}
};

private
NpcString currentString = null;
private
int[][] currentCoords = {};
/**
* This npc state identifies what coords to use
*/
private int currentState;
/**
* If true, creature will be despawned when user reaches last loc
*/
private boolean autounspawn = true;
/**
* If is NPC_SAY, then NPC will "say words", if is SCREEN, then message will appear on center screen
*/
private String displayMessageType = "NPC_SAY";
/**
* When last message was sent?
*/
private long lastMessage = 0;
/**
* When last player was around NPC
*/
private long lastVisit = 0;
private
boolean configured = false;
/**
* How many set of coords was covered by NPC
*/
private int coordsCovered = 0;

public
TalkinIslandGuides(NpcInstance actor)
{
super(actor);
currentState = 0;
}

@
Override
protected void finalize() throws Throwable
{
super.finalize();
NpcInstance actor = getActor();
if (
actor != null)
{
Creature target = actor.getFollowTarget();
if (
target != null)
target.removeListener(this);
}
}

@
Override
public void onTeleport(Player player, int x, int y, int z, Reflection reflection)
{
// Yes, we approve any teleportation action from player.
// Btw, is very small chance that player will use another teleport than 5th Exploration Area.
playerTeleported();
Creature target = getActor().getFollowTarget();
if (
target != null)
target.removeListener(this);
}

/**
* This is used to detect what coods/message should be used.
*/
protected boolean thinkActive() {
NpcInstance actor = getActor();
Creature target = actor.getFollowTarget();

if (
target == null || !(target instanceof Player)) {
actor.deleteMe();
return
false;
}

int npcId = actor.getNpcId();
int[][] coords;
NpcString string;
NpcString end_String;

switch (
npcId)
{
case
SEARCHING_MYST_POWER_SOLDIER:
currentCoords = SMP_COORDS;
currentString = SEARCHING_MYST_POWER_STRING;
break;
case
BACKUP_SEEKERS_ASSASSIN:
currentCoords = BS_COORDS;
currentString = BACKUP_SEEKERS_STRING;
break;
case
GOING_INTO_REAL_WAR_SOLDIER:
double distLeft = target.getDistance(GRW_COORDS_LEFT[0][0], GRW_COORDS_LEFT[0][1], GRW_COORDS_LEFT[0][2]);
double distRight = target.getDistance(GRW_COORDS_RIGHT[0][0], GRW_COORDS_RIGHT[0][1], GRW_COORDS_RIGHT[0][2]);
if (
distLeft <= distRight)
currentCoords = GRW_COORDS_LEFT;
else
currentCoords = GRW_COORDS_RIGHT;
currentString = GOING_INTO_REAL_WAR_STRING;
break;
case
SEEKER_ESCORT_BLOODHOUND:
currentCoords = SE_COORDS;
currentString = SEEKER_ESCORT_BLOODHOUND_STRING;
autounspawn = true;
displayMessageType = "SCREEN";
actor.setTitle(target.getName());
break;
default:
break;
}


if (
target == null)
{
stopAITask();
actor.deleteMe();
}

//config();

// This NPC is running
actor.setRunning();
if (
actor.getDistance(target) < 200 || currentState == 0)
{
lastVisit = System.currentTimeMillis();
if (
currentState == 0)
++
coordsCovered;
if (
currentState < currentCoords.length)
{
actor.moveToLocation(currentCoords[currentState][0], currentCoords[currentState][1], currentCoords[currentState][2], Rnd.get(0, 50), true);
if (
actor.getDestination() == null)
{
// TODO: We need to set heading to turn NPC to player. Seems this is not work properly
actor.setHeading(target.getHeading());
++
currentState;
}
}
else
{
if (
autounspawn)
actor.deleteMe();

currentString = SEEKER_ESCORT_TELETO_STRING;
switch (
npcId)
{
case
SEEKER_ESCORT_BLOODHOUND:
if (
coordsCovered >= 2)
{
// Yeah, this is awesome >_< Very bad to set quest states from another classes, but we need that.
QuestState st = target.getPlayer().getQuestState(_10365_SeekerEscort.class);
if (
st != null)
((
_10365_SeekerEscort)st.getQuest()).bloodhoundEscorted(st);
}
break;
}
}
}
else
{
// Remove NPC if player not visit it during 1 minute
if (System.currentTimeMillis() - lastVisit > 60000)
{
switch (
npcId)
{
case
SEEKER_ESCORT_BLOODHOUND:
sendMessage(SEEKER_ESCORT_FAIL);
break;
}
stopAITask();
actor.deleteMe();
}
// Don't spam messages
if (System.currentTimeMillis() - lastMessage > 2000)
{
sendMessage(currentString);
lastMessage = System.currentTimeMillis();
}
}

return
true;
}

private
void sendMessage(NpcString message)
{
NpcInstance actor = getActor();
Creature target = actor.getFollowTarget();

if (
displayMessageType.equals("NPC_SAY"))
actor.broadcastPacket(new NpcSay(actor, ChatType.ALL, message, target.getName()));
else if (
displayMessageType.equals("SCREEN"))
target.sendPacket(new ExShowScreenMessage(message, 2000, ExShowScreenMessage.ScreenMessageAlign.TOP_CENTER));
}

public
void playerTeleported()
{
/**
* TODO: We need teleport player to another location.
* This is strange, but player teleported not to the current 5th area location.
* He's teleported to upstair, neer teleporter.
*/
int npcId = getActor().getNpcId();
switch (
npcId)
{
case
SEEKER_ESCORT_BLOODHOUND:
if (
coordsCovered >= 1)
{
currentCoords = SE_COORDS2;
currentString = SEEKER_ESCORT_BLOODHOUND_STRING;
currentState = 0;
autounspawn = false;
getActor().teleToLocation(new Location(SE_COORDS2[0][0], SE_COORDS2[0][1], SE_COORDS2[0][2]));
}
break;
}
}

/**
* These NPC does not have random walk
*/
@Override
protected boolean randomWalk()
{
return
false;
}
}
Ответ
#6
Мда. Берете чужой код, удаляете копирайт, а потом еще и у других просите помочь о_О Хоть бы палец-о-палец ударили, что ли.

Вот этого в скрипте не хватает:
Код:
/**
* This AI is used in GoD starting village quests
* for NPCs that are spawned when player takes quest.
* These NPCs shows path to next NPC by quest.
* Because of these NPCs not so much, we can implement their movement statically
*
* @author Yorie
*/
// aka Deft
Ответ
#7
По оверу же не помогают?
Ответ
#8
Ro_0TT Написал:По оверу же не помогают?

Да уже об этом забыли.
Ответ
#9
Ro_0TT Написал:По оверу же не помогают?
причем тут Овер скрипт не с овера взят

Добавлено через 8 минут
Yorie Написал:Мда. Берете чужой код, удаляете копирайт, а потом еще и у других просите помочь о_О Хоть бы палец-о-палец ударили, что ли.
А зачем придумывать велосипед с нуля лутше доделать не доделаное если в чемто запарился лутше спросить у народа . Все занть не возможно иногда по запарке можно делать не там где надо
Ответ
#10
Dante5 Написал:причем тут Овер скрипт не с овера взят
Уверены?....
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Ошибки в GS. Exception in thread "AISTPool-8" java.lang.StackOverflowError vokforever 3 2,117 07-27-2015, 05:52 PM
Последний пост: n3k0nation
  rec_left error white7777x 10 2,638 12-10-2014, 11:12 AM
Последний пост: gigi1968
  Как включить вывод питоновских логов __init__.py.error.log havoc 0 1,101 09-04-2012, 10:46 PM
Последний пост: havoc
  ERROR Error could not store skills! Againamine 9 3,050 06-16-2012, 07:18 AM
Последний пост: bloodshed
  Java Error Psych_O 4 1,994 02-22-2012, 04:58 AM
Последний пост: Psych_O
  Null Pointer Exception extend 12 3,552 01-11-2012, 01:34 PM
Последний пост: extend

Перейти к форуму:


Пользователи, просматривающие эту тему: 11 Гость(ей)