А я не даю с скриптов OFF HF, я даю только с шарных скриптов Freya.Давай уже сразу фул сет скриптов OFF HF
А то по кусочках
Оно еще и багнутоеРеализация автоанонсов просто нечто, уровень 2007 года.
Оставляет желать лучше данная реализация.package core.gameserver.instancemanager;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import javax.xml.parsers.DocumentBuilderFactory;
import core.gameserver.Announcements;
import core.gameserver.Config;
import core.gameserver.model.AutoAnnounces;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class AutoAnnounce implements Runnable
{
private static final Logger _log = LoggerFactory.getLogger(AutoAnnounce.class);
private static AutoAnnounce _instance;
static HashMap<Integer, AutoAnnounces> _lists;
public static AutoAnnounce getInstance()
{
if(_instance == null)
_instance = new AutoAnnounce();
return _instance;
}
public static void reload()
{
_instance = new AutoAnnounce();
}
public AutoAnnounce()
{
_lists = new HashMap<Integer, AutoAnnounces>();
_log.info("AutoAnnounce: Initializing");
load();
_log.info("AutoAnnounce: Loaded " + _lists.size() + " announce.");
}
private void load()
{
try
{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(false);
factory.setIgnoringComments(true);
File file = new File("./config/autoannounce.xml");
if(!file.exists())
{
_log.warn("AutoAnnounce: NO FILE (./config/autoannounce.xml)");
return;
}
Document doc = factory.newDocumentBuilder().parse(file);
int counterAnnounce = 0;
for(Node n = doc.getFirstChild(); n != null; n = n.getNextSibling())
if("list".equalsIgnoreCase(n.getNodeName()))
{
for(Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
{
if("announce".equalsIgnoreCase(d.getNodeName()))
{
ArrayList<String> msg = new ArrayList<String>();
NamedNodeMap attrs = d.getAttributes();
int delay = Integer.parseInt(attrs.getNamedItem("delay").getNodeValue());
int repeat = Integer.parseInt(attrs.getNamedItem("repeat").getNodeValue());
AutoAnnounces aa = new AutoAnnounces(counterAnnounce);
for(Node cd = d.getFirstChild(); cd != null; cd = cd.getNextSibling())
{
if("message".equalsIgnoreCase(cd.getNodeName()))
msg.add(String.valueOf(cd.getAttributes().getNamedItem("text").getNodeValue()));
}
aa.setAnnounce(delay, repeat, msg);
_lists.put(counterAnnounce, aa);
counterAnnounce++;
}
}
}
_log.info("AutoAnnounce: Load OK");
}
catch(Exception e)
{
_log.warn("AutoAnnounce: Error parsing autoannounce.xml file. " + e);
}
}
public void run()
{
if(_lists.size() <= 0)
return;
for(int i = 0; i < _lists.size(); i+
{
if(_lists.get(i).canAnnounce())
{
ArrayList<String> msg = _lists.get(i).getMessage();
for(int c = 0; c < msg.size(); c+
Announcements.getInstance().announceToAll(msg.get(c));
_lists.get(i).updateRepeat();
}
}
}
}
// Archangels
try
{
NpcTemplate angel = NpcHolder.getInstance().getTemplate(ARCHANGEL);
SimpleSpawner spawnDat;
_angelSpawns.clear();
// 5 random numbers of 10, no duplicates
List<Integer> random = new ArrayList<Integer>();
for(int i = 0; i < 5; i++)
{
int r = -1;
while(r == -1 || random.contains(r))
r = Rnd.get(10);
random.add(r);
}
for(int i : random)
{
spawnDat = new SimpleSpawner(angel);
spawnDat.setAmount(1);
spawnDat.setLoc(ANGEL_LOCATION[i]);
spawnDat.setRespawnDelay(300000);
_angelSpawns.add(spawnDat);
}
}
catch(Exception e)
{
e.printStackTrace();
}
<skill id="23197" levels="1" name="Ball Trapping Orodriel Agathion Special Skill - Buff of Cheers">
<!-- With the power of cheers, for 1 hour, increases Max MP, MP Recovery Bonus, HP Recovery Bonus,
Critical Attack Power, P. Def., Atk. Spd., M. Atk., M. Def., Casting Spd. by 20%, the occurrence rate of
Prominent Damage through damage magic by 2, P. Atk. by 10%, and resistance to de-buffs by 10%. Also decreases
MP consumption needed for skill use by 5% and moving speed by 20%. Reuse Delay 1 hour. Consumes 250 energy. -->
<set name="icon" val="icon.skill_agathion_special" />
<set name="reuseDelay" val="3600000" />
<set name="hitTime" val="4000" />
<set name="target" val="TARGET_ONE" />
<set name="skillType" val="BUFF" />
<set name="operateType" val="OP_ACTIVE" />
<set name="mpConsume2" val="250" />
<for>
<effect count="1" name="Buff" stackOrder="1" stackType="agation" time="3600" val="0">
<mul order="0x30" stat="maxMp" val="1.2" />
<mul order="0x30" stat="cAtkStatic" val="1.2" />
<mul order="0x30" stat="pAtk" val="1.1" />
<mul order="0x30" stat="mAtk" val="1.2" />
<mul order="0x30" stat="mDef" val="1.2" />
<mul order="0x30" stat="pDef" val="1.2" />
<mul order="0x30" stat="pAtkSpd" val="1.2" />
<mul order="0x30" stat="regMp" val="1.2" />
<mul order="0x30" stat="regHp" val="1.2" />
<mul order="0x30" stat="runSpd" val="1.2" />
<add order="0x30" stat="mCritRate" val="2" />
<mul order="0x30" stat="mpConsum" val="0.95" />
<add order="0x40" stat="debuffResist" val="10" />
</effect>
</for>
</skill>
package quests;
import java.util.HashMap;
import java.util.Map;
import l2ft.commons.threading.RunnableImpl;
import l2ft.gameserver.ThreadPoolManager;
import l2ft.gameserver.model.Player;
import l2ft.gameserver.model.base.Race;
import l2ft.gameserver.model.instances.NpcInstance;
import l2ft.gameserver.model.quest.Quest;
import l2ft.gameserver.model.quest.QuestState;
import l2ft.gameserver.scripts.ScriptFile;
public class _999_T1Tutorial extends Quest implements ScriptFile
{
private static int RECOMMENDATION_01 = 1067;
private static int RECOMMENDATION_02 = 1068;
private static int LEAF_OF_MOTHERTREE = 1069;
private static int BLOOD_OF_JUNDIN = 1070;
private static int LICENSE_OF_MINER = 1498;
private static int VOUCHER_OF_FLAME = 1496;
private static int SOULSHOT_NOVICE = 5789;
private static int SPIRITSHOT_NOVICE = 5790;
private static int BLUE_GEM = 6353;
private static int DIPLOMA = 9881;
private static class Event
{
public String htm;
public int radarX;
public int radarY;
public int radarZ;
public int item;
public int classId1;
public int gift1;
public int count1;
public int classId2;
public int gift2;
public int count2;
public Event(String htm, int radarX, int radarY, int radarZ, int item, int classId1, int gift1, int count1, int classId2, int gift2, int count2)
{
this.htm = htm;
this.radarX = radarX;
this.radarY = radarY;
this.radarZ = radarZ;
this.item = item;
this.classId1 = classId1;
this.gift1 = gift1;
this.count1 = count1;
this.classId2 = classId2;
this.gift2 = gift2;
this.count2 = count2;
}
}
private static class Talk
{
public int raceId;
public String[] htmlfiles;
public int npcTyp;
public int item;
public Talk(int raceId, String[] htmlfiles, int npcTyp, int item)
{
this.raceId = raceId;
this.htmlfiles = htmlfiles;
this.npcTyp = npcTyp;
this.item = item;
}
}
private static Map<String, Event> events = new HashMap<String, Event>();
static
{
events.put("32133_02", new Event("32133-03.htm", -119692, 44504, 380, DIPLOMA, 0x7b, SOULSHOT_NOVICE, 200, 0x7c, SOULSHOT_NOVICE, 200));
events.put("30008_02", new Event("30008-03.htm", 0, 0, 0, RECOMMENDATION_01, 0x00, SOULSHOT_NOVICE, 200, 0x00, 0, 0));
events.put("30008_04", new Event("30008-04.htm", -84058, 243239, -3730, 0, 0x00, 0, 0, 0, 0, 0));
events.put("30017_02", new Event("30017-03.htm", 0, 0, 0, RECOMMENDATION_02, 0x0a, SPIRITSHOT_NOVICE, 100, 0x00, 0, 0));
events.put("30017_04", new Event("30017-04.htm", -84058, 243239, -3730, 0, 0x0a, 0, 0, 0x00, 0, 0));
events.put("30370_02", new Event("30370-03.htm", 0, 0, 0, LEAF_OF_MOTHERTREE, 0x19, SPIRITSHOT_NOVICE, 100, 0x12, SOULSHOT_NOVICE, 200));
events.put("30370_04", new Event("30370-04.htm", 45491, 48359, -3086, 0, 0x19, 0, 0, 0x12, 0, 0));
events.put("30129_02", new Event("30129-03.htm", 0, 0, 0, BLOOD_OF_JUNDIN, 0x26, SPIRITSHOT_NOVICE, 100, 0x1f, SOULSHOT_NOVICE, 200));
events.put("30129_04", new Event("30129-04.htm", 12116, 16666, -4610, 0, 0x26, 0, 0, 0x1f, 0, 0));
events.put("30528_02", new Event("30528-03.htm", 0, 0, 0, LICENSE_OF_MINER, 0x35, SOULSHOT_NOVICE, 200, 0x00, 0, 0));
events.put("30528_04", new Event("30528-04.htm", 115642, -178046, -941, 0, 0x35, 0, 0, 0x00, 0, 0));
events.put("30573_02", new Event("30573-03.htm", 0, 0, 0, VOUCHER_OF_FLAME, 0x31, SPIRITSHOT_NOVICE, 100, 0x2c, SOULSHOT_NOVICE, 200));
events.put("30573_04", new Event("30573-04.htm", -45067, -113549, -235, 0, 0x31, 0, 0, 0x2c, 0, 0));
}
private static Map<Integer, Talk> talks = new HashMap<Integer, Talk>();
static
{
talks.put(30017, new Talk(0, new String[]{
"30017-01.htm",
"30017-02.htm",
"30017-04.htm"
}, 0, 0));
talks.put(30008, new Talk(0, new String[]{
"30008-01.htm",
"30008-02.htm",
"30008-04.htm"
}, 0, 0));
talks.put(30370, new Talk(1, new String[]{
"30370-01.htm",
"30370-02.htm",
"30370-04.htm"
}, 0, 0));
talks.put(30129, new Talk(2, new String[]{
"30129-01.htm",
"30129-02.htm",
"30129-04.htm"
}, 0, 0));
talks.put(30573, new Talk(3, new String[]{
"30573-01.htm",
"30573-02.htm",
"30573-04.htm"
}, 0, 0));
talks.put(30528, new Talk(4, new String[]{
"30528-01.htm",
"30528-02.htm",
"30528-04.htm"
}, 0, 0));
talks.put(30018, new Talk(0, new String[]{
"30131-01.htm",
"",
"30019-03a.htm",
"30019-04.htm",
}, 1, RECOMMENDATION_02));
talks.put(30019, new Talk(0, new String[]{
"30131-01.htm",
"",
"30019-03a.htm",
"30019-04.htm",
}, 1, RECOMMENDATION_02));
talks.put(30020, new Talk(0, new String[]{
"30131-01.htm",
"",
"30019-03a.htm",
"30019-04.htm",
}, 1, RECOMMENDATION_02));
talks.put(30021, new Talk(0, new String[]{
"30131-01.htm",
"",
"30019-03a.htm",
"30019-04.htm",
}, 1, RECOMMENDATION_02));
talks.put(30009, new Talk(0, new String[]{
"30530-01.htm",
"30009-03.htm",
"",
"30009-04.htm",
}, 1, RECOMMENDATION_01));
talks.put(30011, new Talk(0, new String[]{
"30530-01.htm",
"30009-03.htm",
"",
"30009-04.htm",
}, 1, RECOMMENDATION_01));
talks.put(30012, new Talk(0, new String[]{
"30530-01.htm",
"30009-03.htm",
"",
"30009-04.htm",
}, 1, RECOMMENDATION_01));
talks.put(30056, new Talk(0, new String[]{
"30530-01.htm",
"30009-03.htm",
"",
"30009-04.htm",
}, 1, RECOMMENDATION_01));
talks.put(30400, new Talk(1, new String[]{
"30131-01.htm",
"30400-03.htm",
"30400-03a.htm",
"30400-04.htm",
}, 1, LEAF_OF_MOTHERTREE));
talks.put(30401, new Talk(1, new String[]{
"30131-01.htm",
"30400-03.htm",
"30400-03a.htm",
"30400-04.htm",
}, 1, LEAF_OF_MOTHERTREE));
talks.put(30402, new Talk(1, new String[]{
"30131-01.htm",
"30400-03.htm",
"30400-03a.htm",
"30400-04.htm",
}, 1, LEAF_OF_MOTHERTREE));
talks.put(30403, new Talk(1, new String[]{
"30131-01.htm",
"30400-03.htm",
"30400-03a.htm",
"30400-04.htm",
}, 1, LEAF_OF_MOTHERTREE));
talks.put(30131, new Talk(2, new String[]{
"30131-01.htm",
"30131-03.htm",
"30131-03a.htm",
"30131-04.htm",
}, 1, BLOOD_OF_JUNDIN));
talks.put(30404, new Talk(2, new String[]{
"30131-01.htm",
"30131-03.htm",
"30131-03a.htm",
"30131-04.htm",
}, 1, BLOOD_OF_JUNDIN));
talks.put(30574, new Talk(3, new String[]{
"30575-01.htm",
"30575-03.htm",
"30575-03a.htm",
"30575-04.htm",
}, 1, VOUCHER_OF_FLAME));
talks.put(30575, new Talk(3, new String[]{
"30575-01.htm",
"30575-03.htm",
"30575-03a.htm",
"30575-04.htm",
}, 1, VOUCHER_OF_FLAME));
talks.put(30530, new Talk(4, new String[]{
"30530-01.htm",
"30530-03.htm",
"",
"30530-04.htm",
}, 1, LICENSE_OF_MINER));
talks.put(32133, new Talk(5, new String[]{
"32133-01.htm",
"32133-02.htm",
"32133-04.htm"
}, 0, 0));
talks.put(32134, new Talk(5, new String[]{
"32134-01.htm",
"32134-03.htm",
"",
"32134-04.htm",
}, 1, DIPLOMA));
}
public void onLoad()
{
}
public void onReload()
{
}
public void onShutdown()
{
}
public _999_T1Tutorial()
{
super(false);
addStartNpc(30008, 30009, 30017, 30019, 30129, 30131, 30573, 30575, 30370, 30528, 30530, 30400, 30401, 30402, 30403, 30404, 32133, 32134);
addTalkId(30008, 30009, 30017, 30019, 30129, 30131, 30573, 30575, 30370, 30528, 30530, 30400, 30401, 30402, 30403, 30404, 32133, 32134);
addFirstTalkId(30008, 30009, 30017, 30019, 30129, 30131, 30573, 30575, 30370, 30528, 30530, 30400, 30401, 30402, 30403, 30404, 32133, 32134);
addKillId(18342, 20001);
}
@Override
public String onEvent(String event, QuestState st, NpcInstance npc)
{
QuestState qs = st.getPlayer().getQuestState(_255_Tutorial.class);
if(qs == null || st == null)
return null;
Player player = st.getPlayer();
if(player == null)
return null;
String htmltext = event;
int Ex = qs.getInt("Ex");
int classId = player.getClassId().getId();
boolean isMage = (player.getClassId().getRace() != Race.orc) && player.getClassId().isMage();
if(event.equalsIgnoreCase("TimerEx_NewbieHelper"))
{
if(Ex == 0)
{
if(isMage)
st.playTutorialVoice("tutorial_voice_009b");
else
st.playTutorialVoice("tutorial_voice_009a");
qs.set("Ex", "1");
}
else if(Ex == 3)
{
st.playTutorialVoice("tutorial_voice_010a");
qs.set("Ex", "4");
}
return null;
}
else if(event.equalsIgnoreCase("TimerEx_GrandMaster"))
{
if(Ex >= 4)
{
st.showQuestionMark(7);
st.playSound(SOUND_TUTORIAL);
st.playTutorialVoice("tutorial_voice_025");
}
return null;
}
else if(event.equalsIgnoreCase("isle"))
{
st.addRadar(-119692, 44504, 380);
player.teleToLocation(-120050, 44500, 360);
String title = npc == null ? "" : npc.getTitle() + " " + npc.getName();
htmltext = "<html><body>" + title + "<br>Go to the <font color=\"LEVEL\">Isle of Souls</font> and meet the <font color=\"LEVEL\">Newbie Guide</font> there to learn a number of important tips. He will also give you an item to assist your development.<br>Follow the direction arrow above your head and it will lead you to the Newbie Guide. Good luck!</body></html>";
}
else
{
Event e = events.get(event);
if(e.radarX != 0)
st.addRadar(e.radarX, e.radarY, e.radarZ);
htmltext = e.htm;
if(st.getQuestItemsCount(e.item) > 0 && st.getInt("onlyone") == 0)
{
st.addExpAndSp(0, 50);
st.startQuestTimer("TimerEx_GrandMaster", 60000);
st.takeItems(e.item, 1);
if(Ex <= 3)
qs.set("Ex", "4");
if(classId == e.classId1)
{
st.giveItems(e.gift1, e.count1);
if(e.gift1 == SPIRITSHOT_NOVICE)
st.playTutorialVoice("tutorial_voice_027");
else
st.playTutorialVoice("tutorial_voice_026");
}
else if(classId == e.classId2)
{
if(e.gift2 != 0)
{
st.giveItems(e.gift2, e.count2);
st.playTutorialVoice("tutorial_voice_026");
}
}
st.set("step", "3");
st.set("onlyone", "1");
}
}
return htmltext;
}
@Override
public String onFirstTalk(NpcInstance npc, Player player)
{
String htmltext = "";
QuestState qs = player.getQuestState(_255_Tutorial.class);
if(qs == null)
return htmltext;
QuestState st = player.getQuestState(getClass());
if(st == null)
{
newQuestState(player, CREATED);
st = player.getQuestState(getClass());
}
int Ex = qs.getInt("Ex");
int npcId = npc.getNpcId();
int step = st.getInt("step");
int onlyone = st.getInt("onlyone");
int level = player.getLevel();
boolean isMage = (player.getClassId().getRace() != Race.orc) && player.getClassId().isMage();
Talk t = talks.get(npcId);
if(t == null)
return "";
if((level >= 10 || onlyone == 1) && t.npcTyp == 1)
htmltext = "30575-05.htm";
else if(onlyone == 0 && level < 10)
{
if(player.getRace().ordinal() == t.raceId)
htmltext = t.htmlfiles[0];
if(t.npcTyp == 1)
{
if(step == 0 && Ex < 0)
{
qs.set("Ex", "0");
st.startQuestTimer("TimerEx_NewbieHelper", 30000);
if(isMage)
{
st.set("step", "1");
st.setState(STARTED);
}
else
{
htmltext = "30530-01.htm";
st.set("step", "1");
st.setState(STARTED);
}
}
else if(step == 1 && st.getQuestItemsCount(t.item) == 0 && Ex <= 2)
{
if(st.getQuestItemsCount(BLUE_GEM) > 0)
{
st.takeItems(BLUE_GEM, st.getQuestItemsCount(BLUE_GEM));
st.giveItems(t.item, 1);
st.set("step", "2");
qs.set("Ex", "3");
st.startQuestTimer("TimerEx_NewbieHelper", 30000);
qs.set("ucMemo", "3");
if(isMage)
{
st.playTutorialVoice("tutorial_voice_027");
st.giveItems(SPIRITSHOT_NOVICE, 100);
htmltext = t.htmlfiles[2];
if(htmltext.isEmpty())
htmltext = "<html><body>" + (npc.getTitle().isEmpty() ? "" : npc.getTitle() + " ") + npc.getName() + "<br>I am sorry. I only help warriors. Please go to another Newbie Helper who may assist you.</body></html>";
}
else
{
st.playTutorialVoice("tutorial_voice_026");
st.giveItems(SOULSHOT_NOVICE, 200);
htmltext = t.htmlfiles[1];
if(htmltext.isEmpty())
htmltext = "<html><body>" + (npc.getTitle().isEmpty() ? "" : npc.getTitle() + " ") + npc.getName() + "<br>I am sorry. I only help mystics. Please go to another Newbie Helper who may assist you.</body></html>";
}
}
else
{
if(isMage)
{
htmltext = "30131-02.htm";
if(player.getRace().ordinal() == 3)
htmltext = "30575-02.htm";
}
else
htmltext = "30530-02.htm";
}
}
else if(step == 2)
htmltext = t.htmlfiles[3];
}
else if(t.npcTyp == 0)
{
if(step == 1)
htmltext = t.htmlfiles[0];
else if(step == 2)
htmltext = t.htmlfiles[1];
else if(step == 3)
htmltext = t.htmlfiles[2];
}
}
return htmltext;
}
@Override
public String onKill(NpcInstance npc, QuestState st)
{
QuestState qs = st.getPlayer().getQuestState(_255_Tutorial.class);
if(qs == null)
return null;
int Ex = qs.getInt("Ex");
if(Ex <= 1)
{
st.playTutorialVoice("tutorial_voice_011");
st.showQuestionMark(3);
qs.set("Ex", "2");
}
if(Ex <= 2 && st.getQuestItemsCount(BLUE_GEM) < 1) //TODO: На оффе квестовые итемы дропаются\даются через 3 сек, после убийства моба!
ThreadPoolManager.getInstance().schedule(new DropGem(npc, st), 3000);
return null;
}
public static class DropGem extends RunnableImpl
{
private NpcInstance _npc;
private QuestState _st;
public DropGem(NpcInstance npc, QuestState st)
{
_npc = npc;
_st = st;
}
public void runImpl() throws Exception
{
if(_st != null && _npc != null)
{
_npc.dropItem(_st.getPlayer(), BLUE_GEM, 1);
_st.playSound(SOUND_TUTORIAL);
}
}
}
@Override
public boolean isVisible()
{
return false;
}
}
public void addExpAndCheckBonus(MonsterInstance mob, final double noRateExp, double noRateSp, double partyVitalityMod)
{
if(_activeClass == null)
return;
// Начисление душ камаэлям
double neededExp = calcStat(Stats.SOULS_CONSUME_EXP, 0, mob, null);
if(neededExp > 0 && noRateExp > neededExp)
{
mob.broadcastPacket(new SpawnEmitter(mob, this));
ThreadPoolManager.getInstance().schedule(new GameObjectTasks.SoulConsumeTask(this), 1000);
}
double vitalityBonus = 0.;
int npcLevel = mob.getLevel();
if(Config.ALT_VITALITY_ENABLED)
{
vitalityBonus = mob.isRaid() ? 0. : getVitalityLevel(getNevitSystem().isBlessingActive()) / 2.;
vitalityBonus *= Config.ALT_VITALITY_RATE;
if(noRateExp > 0 && !getNevitSystem().isBlessingActive())
{
if(!isVitalityStop())
{
if(!mob.isRaid())
{
// TODO: Разобратся, нельзя предметы использовать, или предметы не будут давать эффекта?
// (Все предметы для восполнения или поддержания энергии не действуют во время действия Нисхождения Невитта)
if(!(getVarB("NoExp") && getExp() == Experience.LEVEL[getLevel() + 1] - 1))
{
double points = ((noRateExp / (npcLevel * npcLevel)) * 100) / 9;
points *= Config.ALT_VITALITY_CONSUME_RATE;
if(getEffectList().getEffectByType(EffectType.Vitality) != null)
points *= -1;
setVitality(getVitality() - points * partyVitalityMod);
}
}
else
setVitality(getVitality() + Config.ALT_VITALITY_RAID_BONUS);
}
else
setVitality(getVitality());
}
}
//При первом вызове, активируем таймеры бонусов.
if(!isInPeaceZone())
{
setRecomTimerActive(true);
getNevitSystem().startAdventTask();
if((getLevel() - npcLevel) <= 9)
{
int nevitPoints = (int) Math.round(((noRateExp / (npcLevel * npcLevel)) * 100) / 20); //TODO: Формула от балды.
getNevitSystem().addPoints(nevitPoints);
}
}
long normalExp = (long) (noRateExp * ((Config.RATE_XP * getRateExp() + vitalityBonus) * getRecomBonusMul()));
long normalSp = (long) (noRateSp * (Config.RATE_SP * getRateSp() + vitalityBonus));
long expWithoutBonus = (long) (noRateExp * Config.RATE_XP * getRateExp());
long spWithoutBonus = (long) (noRateSp * Config.RATE_SP * getRateSp());
int razLvl = getLevel() - npcLevel;
if((razLvl >= 10 && razLvl <= 14) || (razLvl <= -10 && razLvl >= -14))//30% от 10 до 14 уровней разница
{
addExpAndSp(normalExp/100*30, normalSp/100*30, (normalExp - expWithoutBonus)/100*30, (normalSp - spWithoutBonus)/100*30, false, true);
return;
}
if(razLvl > 14 || razLvl < -14)//0% свыше 14 уровней разница
{
addExpAndSp(0, 0, 0, 0, false, true);
return;
}
addExpAndSp(normalExp, normalSp, normalExp - expWithoutBonus, normalSp - spWithoutBonus, false, true);
}
Твое по офу ПТССКРИПТЫКАКНАОФЕ я уже лично видел наУ парня даже формулы виталити "ПА ОФУ".Код:public void addExpAndCheckBonus(MonsterInstance mob, final double noRateExp, double noRateSp, double partyVitalityMod) { if(_activeClass == null) return; // Начисление душ камаэлям double neededExp = calcStat(Stats.SOULS_CONSUME_EXP, 0, mob, null); if(neededExp > 0 && noRateExp > neededExp) { mob.broadcastPacket(new SpawnEmitter(mob, this)); ThreadPoolManager.getInstance().schedule(new GameObjectTasks.SoulConsumeTask(this), 1000); } double vitalityBonus = 0.; int npcLevel = mob.getLevel(); if(Config.ALT_VITALITY_ENABLED) { vitalityBonus = mob.isRaid() ? 0. : getVitalityLevel(getNevitSystem().isBlessingActive()) / 2.; vitalityBonus *= Config.ALT_VITALITY_RATE; if(noRateExp > 0 && !getNevitSystem().isBlessingActive()) { if(!isVitalityStop()) { if(!mob.isRaid()) { // TODO: Разобратся, нельзя предметы использовать, или предметы не будут давать эффекта? // (Все предметы для восполнения или поддержания энергии не действуют во время действия Нисхождения Невитта) if(!(getVarB("NoExp") && getExp() == Experience.LEVEL[getLevel() + 1] - 1)) { double points = ((noRateExp / (npcLevel * npcLevel)) * 100) / 9; points *= Config.ALT_VITALITY_CONSUME_RATE; if(getEffectList().getEffectByType(EffectType.Vitality) != null) points *= -1; setVitality(getVitality() - points * partyVitalityMod); } } else setVitality(getVitality() + Config.ALT_VITALITY_RAID_BONUS); } else setVitality(getVitality()); } } //При первом вызове, активируем таймеры бонусов. if(!isInPeaceZone()) { setRecomTimerActive(true); getNevitSystem().startAdventTask(); if((getLevel() - npcLevel) <= 9) { int nevitPoints = (int) Math.round(((noRateExp / (npcLevel * npcLevel)) * 100) / 20); //TODO: Формула от балды. getNevitSystem().addPoints(nevitPoints); } } long normalExp = (long) (noRateExp * ((Config.RATE_XP * getRateExp() + vitalityBonus) * getRecomBonusMul())); long normalSp = (long) (noRateSp * (Config.RATE_SP * getRateSp() + vitalityBonus)); long expWithoutBonus = (long) (noRateExp * Config.RATE_XP * getRateExp()); long spWithoutBonus = (long) (noRateSp * Config.RATE_SP * getRateSp()); int razLvl = getLevel() - npcLevel; if((razLvl >= 10 && razLvl <= 14) || (razLvl <= -10 && razLvl >= -14))//30% от 10 до 14 уровней разница { addExpAndSp(normalExp/100*30, normalSp/100*30, (normalExp - expWithoutBonus)/100*30, (normalSp - spWithoutBonus)/100*30, false, true); return; } if(razLvl > 14 || razLvl < -14)//0% свыше 14 уровней разница { addExpAndSp(0, 0, 0, 0, false, true); return; } addExpAndSp(normalExp, normalSp, normalExp - expWithoutBonus, normalSp - spWithoutBonus, false, true); }
А когда он глянет виталити и какие скилы он увидитУ парня даже формулы виталити "ПА ОФУ".Код:public void addExpAndCheckBonus(MonsterInstance mob, final double noRateExp, double noRateSp, double partyVitalityMod) { if(_activeClass == null) return; // Начисление душ камаэлям double neededExp = calcStat(Stats.SOULS_CONSUME_EXP, 0, mob, null); if(neededExp > 0 && noRateExp > neededExp) { mob.broadcastPacket(new SpawnEmitter(mob, this)); ThreadPoolManager.getInstance().schedule(new GameObjectTasks.SoulConsumeTask(this), 1000); } double vitalityBonus = 0.; int npcLevel = mob.getLevel(); if(Config.ALT_VITALITY_ENABLED) { vitalityBonus = mob.isRaid() ? 0. : getVitalityLevel(getNevitSystem().isBlessingActive()) / 2.; vitalityBonus *= Config.ALT_VITALITY_RATE; if(noRateExp > 0 && !getNevitSystem().isBlessingActive()) { if(!isVitalityStop()) { if(!mob.isRaid()) { // TODO: Разобратся, нельзя предметы использовать, или предметы не будут давать эффекта? // (Все предметы для восполнения или поддержания энергии не действуют во время действия Нисхождения Невитта) if(!(getVarB("NoExp") && getExp() == Experience.LEVEL[getLevel() + 1] - 1)) { double points = ((noRateExp / (npcLevel * npcLevel)) * 100) / 9; points *= Config.ALT_VITALITY_CONSUME_RATE; if(getEffectList().getEffectByType(EffectType.Vitality) != null) points *= -1; setVitality(getVitality() - points * partyVitalityMod); } } else setVitality(getVitality() + Config.ALT_VITALITY_RAID_BONUS); } else setVitality(getVitality()); } } //При первом вызове, активируем таймеры бонусов. if(!isInPeaceZone()) { setRecomTimerActive(true); getNevitSystem().startAdventTask(); if((getLevel() - npcLevel) <= 9) { int nevitPoints = (int) Math.round(((noRateExp / (npcLevel * npcLevel)) * 100) / 20); //TODO: Формула от балды. getNevitSystem().addPoints(nevitPoints); } } long normalExp = (long) (noRateExp * ((Config.RATE_XP * getRateExp() + vitalityBonus) * getRecomBonusMul())); long normalSp = (long) (noRateSp * (Config.RATE_SP * getRateSp() + vitalityBonus)); long expWithoutBonus = (long) (noRateExp * Config.RATE_XP * getRateExp()); long spWithoutBonus = (long) (noRateSp * Config.RATE_SP * getRateSp()); int razLvl = getLevel() - npcLevel; if((razLvl >= 10 && razLvl <= 14) || (razLvl <= -10 && razLvl >= -14))//30% от 10 до 14 уровней разница { addExpAndSp(normalExp/100*30, normalSp/100*30, (normalExp - expWithoutBonus)/100*30, (normalSp - spWithoutBonus)/100*30, false, true); return; } if(razLvl > 14 || razLvl < -14)//0% свыше 14 уровней разница { addExpAndSp(0, 0, 0, 0, false, true); return; } addExpAndSp(normalExp, normalSp, normalExp - expWithoutBonus, normalSp - spWithoutBonus, false, true); }
Прежде чем Высказывать Вылаживай пруфы. Естественно код.Твое по офу ПТССКРИПТЫКАКНАОФЕ я уже лично видел наВы не можете просматривать ссылку пожалуйста воспользуйтесь следующими ссылками Вход или Регистрация
10.Запрещены какие-либо необоснованные (без доказательств) обвиненияТо чувство, когда папки ЗГ обсираются публчично в очередной раз, а стыдно почему-то мне
Давайте может обсудим говнокод JTS (где все по офу и жалобы только на диалоги)?
Или сборки СССРа на которых фейлились ВСЕ его клиенты и нет ниодного успешного проекта.
Или давай обсудим кика, у которого просто - ничего нет.
А причем тут он когда это комментарий разработчика выложен былСССР, манголы и прочии сочувствующие им леваки поддакивают в такт, отсасавшему за сборку/илиещечтото кику,
кик публикует куски кода (часть из которых мне доставалось в наследство) и прикрепляет комментарии к ним в духе "Оставляет желать лучше данная реализация" или "Код просто отличный" - ничего не значащие, без конкретики или пояснений.
очень смешно наблюдать, за людьми, у которых нет никаких достижений в этой сфере, не успешных проектов, не разработок, не клиентов с успешными проектами.
Также весело наблюдать за тем, как один клоун, который учит математики за 5 класс (как делить целые числа без остатка), поддакивает другому клоуно, который в подобных тестах ошибается xD И эти люди пытаются на своем колхозном языке объяснить мне - что не так.
особо яросто в ход идут комментарии другого ноунейма, модера с проекта emerald, хотя относительно его руководитель проекта дал мне четкие объяснения
Посмотреть вложение 18985
Кик я знаю как это работает, можешь не пояснять, ты привратил свой форум в ЗГ2, я разочарован.10.Запрещены какие-либо необоснованные (без доказательств) обвинения
Оно и видно как ваши клиенты о вас говорят и правильно с таким кодом и реализациями можно сходить в туалетКороче можете тут поливаться дерьмом сколько влезет))) свои догадки и колхозные рассуждения оставлять для таких же колхозников)
У меня есть - мои проекты тысячники, мои клиенты, мои доходы.
У вас - ПТССКРИПТЫКАКНАОФЕ И ДАЖИЛУЧШЕ!!1
О чем тут можно говорить?)
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?