Hi,
erstmal danke an Steap für den Effekt. Wenn ihr das System einbaut und etwas in die Richtung braucht, dann meldet euch bei ihm! Bitte melden Sie sich an, um diesen Link zu sehen.
Folgendes habe ich hier gemacht:
Bitte melden Sie sich an, um diesen Link zu sehen.
Buff Skills haben einen AoE Effekt, wodurch alle Spieler in einem gesetzten Radius die Buffs bekommen. Das funktioniert, wenn man den Skill auf sich selbst oder auch auf einen anderen Char anwendet.
Ich baue hierbei auf diesem Release von mir auf Bitte melden Sie sich an, um diesen Link zu sehen.
- //find:
- void map_allow_copy(long * pl, int size)
- {
- [...]
- }
- //add after:
- #ifdef BUFF_AOE
- static std::set<DWORD> s_set_buffs_aoe;
- void buff_aoe_add(DWORD dwVnum)
- {
- if (buff_aoe_find(dwVnum) == true)
- {
- fprintf(stdout, "!!! FATAL ERROR !!! multiple BUFF_AOE setting!!\n");
- exit(1);
- }
- fprintf(stdout, "BUFF AOE %d\n", dwVnum);
- s_set_buffs_aoe.insert(dwVnum);
- }
- bool buff_aoe_find(DWORD dwVnum)
- {
- if (g_bAuthServer)
- return false;
- if (s_set_buffs_aoe.find(dwVnum) == s_set_buffs_aoe.end())
- return false;
- return true;
- }
- #endif
- //find function
- static bool __LoadGeneralConfigFile(const char* configName)
- //add to loop while (fgets(buf, 256, fp))
- #ifdef BUFF_AOE
- TOKEN("BUFF_AOE")
- {
- char* p = value_string;
- string stNum;
- for (; *p; p++)
- {
- if (isnhspace(*p))
- {
- if (stNum.length())
- {
- DWORD dwVnum = 0;
- str_to_number(dwVnum, stNum.c_str());
- buff_aoe_add(dwVnum);
- stNum.clear();
- }
- }
- else
- stNum += *p;
- }
- if (stNum.length())
- {
- DWORD dwVnum = 0;
- str_to_number(dwVnum, stNum.c_str());
- buff_aoe_add(dwVnum);
- }
- continue;
- }
- #endif
- //search in function UseSkill
- if (dwVnum == SKILL_CHAIN)
- {
- ResetChainLightningIndex();
- AddChainLightningExcept(pkVictim);
- }
- //add after
- #ifdef BUFF_AOE
- if ((buff_aoe_find(dwVnum)) && (IS_SET(pkSk->dwFlag, SKILL_FLAG_BUFF_AOE)))
- {
- LPSECTREE_MAP pMap = SECTREE_MANAGER::instance().GetMap(GetMapIndex());
- if (pMap != NULL)
- {
- FFindPC f;
- pMap->for_each(f);
- if (f.m_mapPC.size() > 0)
- {
- std::map<DWORD, LPCHARACTER>::iterator pc = f.m_mapPC.begin();
- float max = 1500.0f; //Distance for players which are getting buffed
- while (pc != f.m_mapPC.end())
- {
- float dist = DISTANCE_SQRT(GetX() - pc->second->GetX(), GetY() - pc->second->GetY());
- if (dist != 0 && max > dist)
- {
- //if you need/want more conditions add them here, like same empire or level gap
- ComputeSkill(dwVnum, pc->second);
- }
- pc++;
- }
- }
- }
- }
- #endif
Bitte melden Sie sich an, um diesen Anhang zu sehen.
Hinweis: Der ganze Client Kram macht nur Sinn, wenn ihr einen Effekt habt den ihr anzeigen lassen wollt. Der Vollständigkeit halber gebe ich hier aber ein Beispiel mit, wie man das machen KANN.
- //add new function above void initPlayer
- #ifdef BUFF_AOE
- PyObject* playerIsBuffAOE(PyObject* poSelf, PyObject* poArgs)
- {
- std::set<int> buff_aoe = { 94,95,96 }; //Skills which will get the AoE effect, has to be adjusted
- int dwSkillVnum = 0;
- if (!PyTuple_GetInteger(poArgs,0,&dwSkillVnum))
- {
- return Py_BuildException();
- }
- return Py_BuildValue("b", buff_aoe.find(dwSkillVnum) != buff_aoe.end());
- }
- #endif
- //In function initPlayer, static PyMethodDef s_method[] =
- #ifdef BUFF_AOE
- { "IsBuffAOE", playerIsBuffAOE, METH_VARARGS },
- #endif
- //in def __LoadGameShamanEx, Block ## SKILL
- //My example is gicheon skill (crit buff) only, repeat that for each skill you want
- if app.BUFF_AOE:
- if player.IsBuffAOE(96):
- chrmgr.RegisterCacheMotionData(chr.MOTION_MODE_GENERAL, chr.MOTION_SKILL+6, "gicheon_target_aoe.msa")
- else:
- chrmgr.RegisterCacheMotionData(chr.MOTION_MODE_GENERAL, chr.MOTION_SKILL+6, "gicheon_target.msa")
- else:
- chrmgr.RegisterCacheMotionData(chr.MOTION_MODE_GENERAL, chr.MOTION_SKILL+6, "gicheon_target.msa")
- copy file and save as 'gicheon_target_aoe.msa'
- extend the copied file with an additional effect. Paths to the effect have to be adjusted (Group Event02)
- ScriptType MotionData
- MotionFileName "D:\Ymir Work\pc\shaman\skill\target.GR2"
- MotionDuration 1.666667
- Group MotionEventData
- {
- MotionEventDataCount 3
- Group Event00
- {
- MotionEventType 1
- StartingTime 0.081197
- IndependentFlag 0
- AttachingEnable 0
- AttachingBoneName "Bip01 Head"
- FollowingEnable 0
- EffectFileName "d:/ymir work/pc/shaman/effect/6gicheon_making.mse"
- EffectPosition 0.000000 0.000000 0.000000
- }
- Group Event01
- {
- MotionEventType 10
- StartingTime 1.305758
- EffectFileName "d:/ymir work/pc/shaman/effect/6gicheon_blow.mse"
- EffectPosition 0.000000 0.000000 110.000000
- FollowingEnable 1
- }
- Group Event02
- {
- MotionEventType 1
- StartingTime 0.081197
- IndependentFlag 0
- AttachingEnable 0
- AttachingBoneName "Bip01 Footsteps"
- FollowingEnable 0
- EffectFileName "d:/ymir work/effect/etc/skill_target_indicator/skill_target_indicator.mse"
- EffectPosition 0.000000 0.000000 0.000000
- }
- }