Сообщений: 314
Тем: 32
Зарегистрирован: Mar 2010
Репутация:
2,207
Сейчас пытаюсь написать скрип по поводу штрафа на лут. Например если ты 10 лвл то с моба 1 лвл ни чего не падает. А если 5 лвл то по 50% то % выпадания по базе.
Скрипт похож на штраф exp по лвл. Если кто то уже подобное делал, подскажите плиз.
Сообщений: 314
Тем: 32
Зарегистрирован: Mar 2010
Репутация:
2,207
03-25-2010, 10:59 AM
(Сообщение последний раз редактировалось: 03-25-2010, 11:55 AM Shema.)
Скрипт пишу без % соотношения. Просто если лвл < -5лвл или лвл >5лвл, то значение будет равно , например 1
Скипт размещаю здесь:
C:\ae-go\AE-go_GameServer\src\com\aionemu\gameserver\utils\stats
название DPRewardEnum.java
package com.aionemu.gameserver.utils.stats;
import java.util.NoSuchElementException;
/**
*
*/
public enum DPRewardEnum
/**
* int DpFallout = DpRewardEnum.DpRewardFrom(targetLevel - playerLevel);
*
*/
MINUS_5(-5,1),
MINUS_4(-4,1),
MINUS_3(-3,1),
MINUS_2(-2,1),
MINUS_1(-1,1),
ZERO(0,1),
PLUS_1(1,1),
PLUS_2(2,1),
PLUS_3(3,1),
PLUS_4(4,1),
PLUS_5(5,1);
private int dpRewardOut;
private int levelDifference;
private DPRewardEnum(int levelDifference,int dpRewardOut)
{
this.levelDifference = levelDifference;
this.dpRewardOut = dpRewardOut;
}
public int rewardOut()
{
return dpRewardOut;
}
public static int dpRewardFrom(int levelDifference)
{
if(levelDifference < MINUS_5.levelDifference)
{
return MINUS_5.dpRewardOut;
}
if(levelDifference > PLUS_5.levelDifference)
{
return PLUS_5.dpRewardOut;
}
for(DPRewardEnum dpReward : values())
{
if(dpReward.levelDifference == levelDifference)
{
return dpReward.dpRewardOut;
}
}
throw new NoSuchElementException("DP reward for such level difference was not found");
}
}
Добавлено через 2 минуты
Нужно вписать строку :
int DpFallout = DPRewardEnum.dpRewardFrom(targetLevel - playerLevel);
Возможно ее указать просто в скрипте StatFunctions.java
например здесь :
public static long calculateSoloExperienceReward(Player player, Creature target)
{
int playerLevel = player.getCommonData().getLevel();
int targetLevel = target.getLevel();
int maxXp = ((Npc) target).getObjectTemplate().getStatsTemplate().getMaxXp();
//TODO take baseXP from target object (additional attribute in stats template is needed)
int baseXP = maxXp;
int DpFallout = DpRewardEnum.DpRewardFrom(targetLevel - playerLevel);
int xpPercentage = XPRewardEnum.xpRewardFrom(targetLevel - playerLevel);
return (int) Math.floor(baseXP * xpPercentage * player.getRates().getXpRate() / 100);
}
Добавлено через 6 минут
Теперь в MonsterController.java
C:\ae-go\AE-go_GameServer\src\com\aionemu\gameserver\controllers
Нужно указать, что если разница лвл игрока = разница лвл моба, то дроп падет. ))
Вот здесь я и загруз, как это сделать. )))
Сообщений: 610
Тем: 12
Зарегистрирован: Jan 2010
Репутация:
1,021
У меня последняя сборка. Я 50 моб 3, ни фига не падает, а если ты 3 то полный дроп. На фиг заново велосипед изобретать?
Сообщений: 314
Тем: 32
Зарегистрирован: Mar 2010
Репутация:
2,207
03-25-2010, 11:11 AM
(Сообщение последний раз редактировалось: 03-25-2010, 05:13 PM Shema.)
У меня сборка 1674, последняя. Все падет, Я 50 лвл бью моба 9 лвл и мне падет грин шмот. Ни то. Ты просто не тех бьешь. Штаф нужен обязательно что б меньше фармили хаи на мелких.
Добавлено через 6 часов 2 минуты
Кто то знает к какому значению можно при ровнять int DpFallout, что б если лвл человека меньше или больше 5, то лут ни падает.
public class MonsterController extends NpcController
{
@Override
public void doDrop(Player player)
{
super.doDrop(player);
sp.getDropService().registerDrop(getOwner() , player);
PacketSendUtility.broadcastPacket(this.getOwner(), new SM_LOOT_STATUS(this.getOwner().getObjectId(), 0));
}
@Override
public void doReward(Creature creature)
{
super.doReward(creature);
if(creature instanceof Player)
{
Player player = (Player) creature;
if(player.getPlayerGroup() == null) //solo
{
long xpReward = StatFunctions.calculateSoloExperienceReward(player, getOwner());
player.getCommonData().addExp(xpReward);
//DPreward
int currentDp = player.getCommonData().getDp();
int dpReward = StatFunctions.calculateSoloDPReward(player, getOwner());
player.getCommonData().setDp(dpReward + currentDp);
//AP reward in abyss basic
if(player.getWorldId() == WorldMapType.RESHANTA.getId())
sp.getAbyssService().doReward(getOwner(), player);
sp.getQuestEngine().onKill(new QuestEnv(getOwner(), player, 0 , 0));
}
else
{
sp.getGroupService().doReward(player.getPlayerGroup(), getOwner());
}
}
}
@Override
public void onRespawn()
{
super.onRespawn();
sp.getDropService().unregisterDrop(getOwner());
}
@Override
public Monster getOwner()
{
return (Monster) super.getOwner();
}
}
Сообщений: 69
Тем: 0
Зарегистрирован: Mar 2010
Репутация:
70
все непойму, причем тут DP?
Сообщений: 314
Тем: 32
Зарегистрирован: Mar 2010
Репутация:
2,207
DP это я в сокращении написал Drop, можно и по другому написать.)
Я тут думал возможно просто написать, что если разница лвл игрока совпадает с с диапазоном разницы по лвл моба, то дроп падает, а если нет то ни чего не происходит.
Возможно просто ссылку прописать в формуле на MonsterController.java, что если действие правильное то то процесс работает, если нет то финиш.
Сообщений: 69
Тем: 0
Зарегистрирован: Mar 2010
Репутация:
70
03-26-2010, 02:57 PM
(Сообщение последний раз редактировалось: 03-26-2010, 02:58 PM celler.)
DP это энергия для некоторых скиллов, полоска которой находится под маной.
А дроп тут
D:\Aion-Game\AE-go_GameServer\src\com\aionemu\gameserver\model\drop
Добавлено через 1 минуту
А тут если неошибаюсь формулы дропа
D:\Aion-Game\AE-go_GameServer\src\com\aionemu\gameserver\services
в DropService.java
Сообщений: 314
Тем: 32
Зарегистрирован: Mar 2010
Репутация:
2,207
О. спасибо. Ни там смотрел значит.))
Выходит в этой формуле нужно добавить значение разницы по лвл.
/**
* When player clicks on dead NPC to request drop list
*
* @param player
* @param npcId
*/
public void requestDropList(Player player, int npcId)
{
if(player == null || !dropRegistrationMap.containsKey(npcId))
return;
DropNpc dropNpc = dropRegistrationMap.get(npcId);
if(!dropNpc.containsKey(player.getObjectId()))
{
PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.STR_LOOT_NO_RIGHT());
return;
}
if(dropNpc.isBeingLooted())
{
PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.STR_LOOT_FAIL_ONLOOTING());
return;
}
dropNpc.setBeingLooted(player.getObjectId());
Set<DropItem> dropItems = currentDropMap.get(npcId);
if(dropItems == null)
{
dropItems = Collections.emptySet();
}
PacketSendUtility.sendPacket(player, new SM_LOOT_ITEMLIST(npcId, dropItems, player));
// PacketSendUtility.sendPacket(player, new SM_LOOT_STATUS(npcId, size > 0 ? size - 1 : size));
PacketSendUtility.sendPacket(player, new SM_LOOT_STATUS(npcId, 2));
player.unsetState(CreatureState.ACTIVE);
player.setState(CreatureState.LOOTING);
PacketSendUtility.broadcastPacket(player, new SM_EMOTION(player, 35, 0, npcId), true);
// if dropitems is empty, resend droplist for close loot
if(dropItems.size() == 0)
resendDropList(player, npcId, dropItems);
}
Сообщений: 69
Тем: 0
Зарегистрирован: Mar 2010
Репутация:
70
Расчет с формулой там чуть ниже, вот:
/**
* After NPC dies - it can register arbitrary drop
*
* @param npc
*/
public void registerDrop(Npc npc, Player player)
{
int npcUniqueId = npc.getObjectId();
int npcTemplateId = npc.getObjectTemplate().getTemplateId();
Set<DropTemplate> templates = dropList.getDropsFor(npcTemplateId);
if(templates != null)
{
Set<DropItem> droppedItems = new HashSet<DropItem>();
int index = 1;
for(DropTemplate dropTemplate : templates)
{
DropItem dropItem = new DropItem(dropTemplate);
int questId = dropItem.getDropTemplate().getQuest();
if(questId != 0)
{
if(player == null)
continue;
QuestState qs = player.getQuestStateList().getQuestState(questId);
if(qs == null || qs.getStatus() != QuestStatus.START)
continue;
}
dropItem.calculateCount(player.getRates().getDropRate());
if(dropItem.getCount() > 0)
{
dropItem.setIndex(index++);
droppedItems.add(dropItem);
}
}
currentDropMap.put(npcUniqueId, droppedItems);
// TODO player should not be null
if(player != null)
{
if(player.isInGroup())
{
dropRegistrationMap.put(npcUniqueId, new DropNpc(groupService.getMembersToRegistrateByRules(player,
player.getPlayerGroup())));
}
else
{
List<Integer> singlePlayer = new ArrayList<Integer>();
singlePlayer.add(player.getObjectId());
dropRegistrationMap.put(npcUniqueId, new DropNpc(singlePlayer));
}
}
}
}
Сообщений: 314
Тем: 32
Зарегистрирован: Mar 2010
Репутация:
2,207
Ты тут поменял местами? Какой принцип тут получается с этого скрипта?
|