14.04.2011, 20:59
|
#9
|
Пользователь
Регистрация: 15.12.2010
Адрес: эта страна
Возраст: 34
Сообщений: 202
Отблагодарили 102 раз(а)
Рейтинг мнений:
|
Re: Подбор дропа с нпц
Цитата:
кстати для теграка и геры будет достаточно прописать именно NON_ATTACKABLE, я так и сделал у ся на серве, и всё прекрасно работает
|
Вынужден признать, что не совсем достаточно  .
В этом случае придётся внести изменение в метод spawnObject в SpawnEngine . Если у вас в ядре есть класс Monster и MonsterContoller.
PHP код:
switch(objectId)
{
// Gera, Tegrak
case 258200:
case 258205:
npc = new Monster(iDFactory.nextId(), new MonsterController(), spawn, template);
npc.setKnownlist(new StaticObjectKnownList(npc));
break;
}
Вот весь код метода спавна с месторасположением примера описанного выше.
Свернуть ↑
PHP код:
/**
* Creates VisibleObject instance and spawns it using given {@link SpawnTemplate} instance.
*
* @param spawn
* @return created and spawned VisibleObject
*/
public VisibleObject spawnObject(SpawnTemplate spawn, int instanceIndex) {
VisibleObjectTemplate template = null;
if (spawn == null) {
return null;
}
int objectId = spawn.getSpawnGroup().getNpcid();
NpcData npcData = DataManager.NPC_DATA;
if (objectId > 400000 && objectId < 499999)// gatherable
{
template = DataManager.GATHERABLE_DATA.getGatherableTemplate(objectId);
if (template == null)
return null;
gatherableCounter++;
} else
// npc
{
template = npcData.getNpcTemplate(objectId);
if (template == null) {
log.error("No template for NPC " + String.valueOf(objectId));
return null;
}
npcCounter++;
}
IDFactory iDFactory = IDFactory.getInstance();
if (template instanceof NpcTemplate) {
NpcType npcType = ((NpcTemplate) template).getNpcType();
Npc npc = null;
if (npcType != null) {
switch (npcType) {
case AGGRESSIVE:
case ATTACKABLE:
npc = new Monster(iDFactory.nextId(), new MonsterController(),
spawn, template);
npc.setKnownlist(new NpcKnownList(npc));
break;
case POSTBOX:
npc = new Npc(iDFactory.nextId(), new PostboxController(), spawn,
template);
npc.setKnownlist(new StaticObjectKnownList(npc));
break;
case RESURRECT:
BindpointController bindPointController = new BindpointController();
bindPointController.setBindPointTemplate(DataManager.BIND_POINT_DATA.getBindPointTemplate(objectId));
npc = new Npc(iDFactory.nextId(), bindPointController, spawn, template);
npc.setKnownlist(new StaticObjectKnownList(npc));
break;
case USEITEM:
npc = new Npc(iDFactory.nextId(), new ActionitemController(),
spawn, template);
npc.setKnownlist(new StaticObjectKnownList(npc));
break;
case PORTAL:
npc = new Npc(iDFactory.nextId(), new PortalController(), spawn,
template);
npc.setKnownlist(new StaticObjectKnownList(npc));
break;
default: // NON_ATTACKABLE
npc = new Npc(iDFactory.nextId(), new NpcController(), spawn,
template);
npc.setKnownlist(new NpcKnownList(npc));
break;
}
} else {
npc = new Npc(iDFactory.nextId(), new NpcController(), spawn,
template);
npc.setKnownlist(new NpcKnownList(npc));
}
// special exception
switch(objectId)
{
// Gera, Tegrak
case 258200:
case 258205:
npc = new Monster(iDFactory.nextId(), new MonsterController(), spawn, template);
npc.setKnownlist(new StaticObjectKnownList(npc));
break;
// Nightmare Support Npcs
case 730336:
case 730337:
case 730338:
case 730339:
case 700924:
// Nightmare bosses
case 217000:
case 217002:
case 216982:
npc = new Monster(iDFactory.nextId(), new NightmareController(), spawn,
template);
npc.setKnownlist(new StaticObjectKnownList(npc));
break;
// Labdakus, Ramilion
case 278593:
case 212649:
npc = new Monster(iDFactory.nextId(), new MonsterController(), spawn, template);
npc.setKnownlist(new StaticObjectKnownList(npc));
break;
// Silentera Entrance Portals
case 730256:
case 730260:
npc = new Npc(iDFactory.nextId(), new SilenteraCanyonEntranceController(), spawn,
template);
npc.setKnownlist(new StaticObjectKnownList(npc));
break;
}
//steel rake exception
if (objectId == 215402 || objectId == 215403 || objectId == 215404 || objectId == 215405 || objectId == 798378 || objectId == 798379) {
npc = new Npc(iDFactory.nextId(), new SteelRakeController(),
spawn, template);
npc.setKnownlist(new NpcKnownList(npc));
} else if (objectId == 700548 || objectId == 730207) {
npc = new Npc(iDFactory.nextId(), new SteelRakeController(),
spawn, template);
npc.setKnownlist(new StaticObjectKnownList(npc));
}
npc.setNpcSkillList(DataManager.NPC_SKILL_DATA.getNpcSkillList(template.getTemplateId()));
npc.setEffectController(new EffectController(npc));
npc.getController().onRespawn();
bringIntoWorld(npc, spawn, instanceIndex);
return npc;
} else if (template instanceof GatherableTemplate) {
Gatherable gatherable = new Gatherable(spawn, template, iDFactory.nextId(), new GatherableController());
gatherable.setKnownlist(new StaticObjectKnownList(gatherable));
bringIntoWorld(gatherable, spawn, instanceIndex);
return gatherable;
}
return null;
}
Свернуть ↑Развернуть ↓
Сдесь делается исключение для указанных нпс, посему этот метод не универсален. В моём посте выше, первый способ решения данной проблемы будет универсальным и позволит собирать дроп с любого враждебного неатакуемого нпс (NON_ATTACKABLE) или с любого атакуемого нпс даже если его trible является дружественным или не агро, при этом не надо будет вносить изменения в SpawnEngine.
Свернуть ↑
PHP код:
<npc_template npc_id="258200" level="57" name="enraged veille" name_id="320035" npc_type="NON_ATTACKABLE" height="0.7" rank="LEGENDARY" race="GCHIEF_LIGHT" tribe="GUARD" srange="20" arange="37" arank="1000" hpgauge="27">
<stats maxHp="120000000" maxXp="25000000" maxMp="2000000" block="200" parry="200" mdef="200" pdef="200" crit="150" power="260" evasion="200" accuracy="200" magic_accuracy="250" walk_speed="1.0" run_speed="8.0" run_speed_fight="8.0" fly_speed="0.0" />
<equipment>
<item>100500746</item>
</equipment>
</npc_template>
<npc_template npc_id="258205" level="57" name="enraged mastarius" name_id="320040" npc_type="NON_ATTACKABLE" height="0.7" rank="LEGENDARY" race="GCHIEF_DARK" tribe="GUARD_DARK" srange="20" arange="37" arank="1000" hpgauge="27">
<stats maxHp="120000000" maxXp="25000000" maxMp="2000000" block="200" parry="200" mdef="200" pdef="200" crit="150" power="260" evasion="200" accuracy="200" magic_accuracy="250" walk_speed="1.0" run_speed="8.0" run_speed_fight="8.0" fly_speed="0.0" />
<equipment>
<item>100100726</item>
</equipment>
</npc_template>
Свернуть ↑Развернуть ↓
Либо можно в метод attackTarget который находится в PlayerController добавить сделующее :
PHP код:
if (target instanceof Npc)
{
if (getOwner().getCommonData().getRace() == Race.ASMODIANS && ((Npc)target).getNpcId() == 258205)
return;
if (getOwner().getCommonData().getRace() == Race.ELYOS && ((Npc)target).getNpcId() == 258200)
return;
}
Используя такой способ этих двух боссов нельзя будет атаковать даже если они ATTACKABLE (если ничего не напутал) .
Свернуть ↑
PHP код:
@Override
public void attackTarget(Creature target) {
Player player = getOwner();
/**
* Check all prerequisites
*/
if (target == null || !player.canAttack())
return;
if (target instanceof Npc)
{
if (getOwner().getCommonData().getRace() == Race.ASMODIANS && ((Npc)target).getNpcId() == 258205)
return;
if (getOwner().getCommonData().getRace() == Race.ELYOS && ((Npc)target).getNpcId() == 258200)
return;
}
PlayerGameStats gameStats = player.getGameStats();
// check player attack Z distance
if (Math.abs(player.getZ() - target.getZ()) > 6)
return;
if (!RestrictionsManager.canAttack(player, target))
return;
int attackSpeed = gameStats.getCurrentStat(StatEnum.ATTACK_SPEED);
long milis = System.currentTimeMillis();
if (milis - lastAttackMilis < attackSpeed) {
/**
* Hack!
*/
//return;
}
lastAttackMilis = milis;
/**
* notify attack observers
*/
super.attackTarget(target);
/**
* Calculate and apply damage
*/
List<AttackResult> attackResult = AttackUtil.calculateAttackResult(player, target);
int damage = 0;
for (AttackResult result : attackResult) {
damage += result.getDamage();
}
long time = System.currentTimeMillis();
int attackType = 0; // TODO investigate attack types
PacketSendUtility.broadcastPacket(player, new SM_ATTACK(player, target, gameStats.getAttackCounter(),
(int) time, attackType, attackResult), true);
target.getController().onAttack(player, damage, true);
gameStats.increaseAttackCounter();
}
Свернуть ↑Развернуть ↓
__________________
Дверь запили!
Последний раз редактировалось flashman; 14.04.2011 в 21:25.
|
|
|