Сообщений: 982
Тем: 73
Зарегистрирован: Jan 2009
Репутация:
2,862
Хочу сделать подбор дропа не только с мобов но и нпц , может кто нашел где сделать )) подскажите
MiR @ Aion Emu
Продам сборки v2.7 v3.9 v4.7 v4.8 v4.9 v5.1 , сборки мастер сервера v1.9 и v2.7 ,пишу скрипты и квесты на заказ , правки ядра , правки даты , писать в ПМ
Сообщений: 1,832
Тем: 26
Зарегистрирован: Jan 2010
Репутация:
3,766
А разве его нет? Оо
Прикольнись с Tribe, должно помочь.
Мы всё сделаем металлом! Чернее чернейшей черноты бесконечности! © Nathan Explotion
Работаю с Aion Java-emu, любой версии. skype: alexsiuss1
Сообщений: 982
Тем: 73
Зарегистрирован: Jan 2009
Репутация:
2,862
Цитата:А разве его нет? Оо
нет если ставиш NON_ATTACKABLE , хочу сделать Геру и Теграка , что бы их не возможно было атаковать своей расе
Цитата:Прикольнись с Tribe, должно помочь.
а поподробней
MiR @ Aion Emu
Продам сборки v2.7 v3.9 v4.7 v4.8 v4.9 v5.1 , сборки мастер сервера v1.9 и v2.7 ,пишу скрипты и квесты на заказ , правки ядра , правки даты , писать в ПМ
Сообщений: 202
Тем: 7
Зарегистрирован: Dec 2010
Репутация:
54
Можно сделать, только NON_ATTACKABLE тут часть общего плана. И кстати для теграка и геры будет достаточно прописать именно NON_ATTACKABLE, я так и сделал у ся на серве, и всё прекрасно работает. Для остальных нпс чуть повозится надо будет.
Вобщем вся фишка в MonsterController и NpcController , а именно в методе doReward, в контролере для нпс он небыл переопределён, а значит остался таким же как и для обшего класса CreatureController, а вот в монстер контролере он был переопределён, посему все объекты которые спавнятся как монстры и наследуют монстер контролер могут выдавать ревард(дроп).
Собсно тут есть два пути:
1) глобальный , поскольку MonsterController extends NpcController тобиш расширяет класс нпсконтролера, можно перенести метод doReward из монстерконтролера в нпсконтролер, далее придётся править нюансы во всей иерархии использования монстерконтролера.
В результате получим возможность сбора дропа с любого нпс.
2) локальный , больше подходит для обработки отдельных нпс, например боссов, порталов и других специфичных объектов. Т.е. просто в при спавне указать какие npcid мы хочем сделать монстрами, и тогда только с них можно будет собрать дроп.
Это уже делается в SpawnEngine в методе SpawnObject .
Дверь запили!
Сообщений: 982
Тем: 73
Зарегистрирован: Jan 2009
Репутация:
2,862
Цитата:А разве его нет? Оо
Прикольнись с Tribe, должно помочь.
или обоснуй , или не пиши если незнаеш! писец все перерыл неработает нех
MiR @ Aion Emu
Продам сборки v2.7 v3.9 v4.7 v4.8 v4.9 v5.1 , сборки мастер сервера v1.9 и v2.7 ,пишу скрипты и квесты на заказ , правки ядра , правки даты , писать в ПМ
Сообщений: 1,832
Тем: 26
Зарегистрирован: Jan 2010
Репутация:
3,766
Можно полегче, я тебе не друг. А "рыл" ты плохо.
Статы
Код: <npc_template npc_id="258205" level="60" name="enraged mastarius" name_id="320040" npc_type="ATTACKABLE" height="0.7" rank="LEGENDARY" race="GCHIEF_DARK" tribe="GUARD_DARK" srange="20" arange="37" arank="1000" hpgauge="27">
<stats maxMp="185843" maxHp="153746955" maxXp="27567000" block="145" parry="144" mdef="146" pdef="148" crit="148" power="142" evasion="143" accuracy="148" magic_accuracy="148" walk_speed="6.75" run_speed="6.75" run_speed_fight="11.0" fly_speed="0.0"/>
<equipment>
<item>100100726</item>
</equipment>
</npc_template>
Ещё для полного феншуя нужно будет редактировать сами трайбы, на agro и friend
Мы всё сделаем металлом! Чернее чернейшей черноты бесконечности! © Nathan Explotion
Работаю с Aion Java-emu, любой версии. skype: alexsiuss1
Сообщений: 982
Тем: 73
Зарегистрирован: Jan 2009
Репутация:
2,862
04-14-2011, 10:35 AM
(Сообщение последний раз редактировалось: 04-14-2011, 12:03 PM Romanz.)
Цитата:npc_type="ATTACKABLE"
ну так напиши как ты сделал если я такой нуб ) , что бы своя раса не могла атаковать , а вторая могла дроп поднять
MiR @ Aion Emu
Продам сборки v2.7 v3.9 v4.7 v4.8 v4.9 v5.1 , сборки мастер сервера v1.9 и v2.7 ,пишу скрипты и квесты на заказ , правки ядра , правки даты , писать в ПМ
Сообщений: 215
Тем: 4
Зарегистрирован: Mar 2010
Репутация:
28
Romanz Написал:ну так напиши как ты сделал если я такой нуб ) , что бы своя раса не могла атаковать , а вторая могла дроп поднять
Слова flashman-a
И кстати для теграка и геры будет достаточно прописать именно NON_ATTACKABLE, я так и сделал у ся на серве, и всё прекрасно работает
Сообщений: 202
Тем: 7
Зарегистрирован: Dec 2010
Репутация:
54
04-14-2011, 08:59 PM
(Сообщение последний раз редактировалось: 04-14-2011, 09:25 PM flashman.)
Цитата:кстати для теграка и геры будет достаточно прописать именно NON_ATTACKABLE, я так и сделал у ся на серве, и всё прекрасно работает
Вынужден признать, что не совсем достаточно .
В этом случае придётся внести изменение в метод spawnObject в SpawnEngine . Если у вас в ядре есть класс Monster и MonsterContoller.
PHP код: <?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 код: <?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 код: <?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 код: <?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 код: <?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();
}
Дверь запили!
Сообщений: 982
Тем: 73
Зарегистрирован: Jan 2009
Репутация:
2,862
спасибо все работает)
MiR @ Aion Emu
Продам сборки v2.7 v3.9 v4.7 v4.8 v4.9 v5.1 , сборки мастер сервера v1.9 и v2.7 ,пишу скрипты и квесты на заказ , правки ядра , правки даты , писать в ПМ
|