Hello
Tudja valaki, hogy hogyan tudom a karakter mozgását tiltani/engedélyezni szerver vagy kliens oldali forrásban?
Probáltam a szerver oldalon a CanMove funkcióba bettenni egy új ellenőrzést hogy ha a játékos szintje több mint 110 akkor false értékkel térjen vissza, de ugyan ugy tud 110 felett mozogni a szintlépés után. Az ellenörzése tuti jó, egyszerű "if" függvény.
Az "affect stun" izléstelen, felejtös.
Szoval az említetteken kívül milyen lehetőségek vannak?
Há mé akarod csóri játékost lebénítani x szint felett? :'( :'(
Az oka nem számít, átmeneti pár percről van szó, ezért lenne jó ha ki/be lehetne kapcsolni a mozgás korlátozást.
Szóval a tárgynál maradva, ötlet?
Kaphat mozgási sebességet is az illető bónusz gyanánt pár perc erejéig :D
(Questes megoldás)
http://metin2hungary.net/index.php/topic,200409.0.html
+
minusz mozgási sebesség
=
Megoldás
quest mozgas begin
state start begin
when login or levelup with pc.get_level() >= 110 begin
syschat("Három percig nem fogsz tudni mozogni!")
affect.add_collect(apply.MOV_SPEED,-500,60*3)
end
end
end
Köszi szépen a válaszokat és a példákat. :-)
szerintem a SendMovePacket függvénybe tedd az ellenőrzést
Ugyan úgy tud mozogni, ha a packet küldést is kiveszem az általad említett szerveroldalt található SendMovePacket funkcióból. Az semmit nem gátolt.
Van még egy ötletem, csak az kicsit összetettebb.
Új enum: keress rá azt hiszem lenght.h-ban: WALKMODE_RUN, majd csinálj egy újat pl WALKMODE_STOP
char.cpp-be írj két új függvényt:
void CHARACTER::StopChar(bool stop)
{
if(!IsPC())
return;
bStopChar = stop;
{
TPacketGCWalkMode p;
p.vid = GetVID();
p.header = HEADER_GC_WALK_MODE;
p.mode = bStopChar? WALKMODE_STOP : WALKMODE_RUN;
PacketView(&p, sizeof(p));
}
}
}
nyilván char.h-ba is írd be, valamint a lekérdező függvényét is, valami ilyesmit
bool IsStopped() { return bStopChar; }
aztán rákeresel erre:
bool m_bNowWalking;
alá
bool bStopChar;
újra char.cpp-ben EncodeInsertPacket függvény:
ez alá a sor alá: p.mode = m_bNowWalking ? WALKMODE_WALK : WALKMODE_RUN;
ezt: p.mode = bStopChar ? WALKMODE_STOP : p.mode;
valamint felette az if (iDur) részt if (iDur && !bStopChar)
majd alatta lesz ez az elágazás: if (entity->IsType(ENTITY_CHARACTER) && GetDesc())
ezt cseréld le:
if (entity->IsType(ENTITY_CHARACTER) && GetDesc())
{
LPCHARACTER ch = (LPCHARACTER) entity;
if (ch->IsStopped())
{
TPacketGCWalkMode p;
p.vid = ch->GetVID();
p.header = HEADER_GC_WALK_MODE;
p.mode = ch->bStopChar ? WALKMODE_STOP : WALKMODE_RUN;
GetDesc()->Packet(&p, sizeof(p));
}
else if (ch->IsWalking())
{
TPacketGCWalkMode p;
p.vid = ch->GetVID();
p.header = HEADER_GC_WALK_MODE;
p.mode = ch->m_bNowWalking ? WALKMODE_WALK : WALKMODE_RUN;
GetDesc()->Packet(&p, sizeof(p));
}
}
majd a SendMovePacket függvény elejére
if(bStopChar)
return;
ezután már majd az adott karaktert a StopChar(true/false) függvénnyel tudod blokkolni, vagy nem
de most jön a kliens oldali rész is, mert ezzel csak elküldtük neki az infot
Packet.h-ba
WALKMODE_WALK,
alá
WALKMODE_STOP,
PythonNetworkSteamPhaseGame-ben keress erre a függvényre:
bool CPythonNetworkStream::RecvWalkModePacket()
logikusan kikövetkeztethető melyik részét cseréld le erre:
if (WALKMODE_STOP == WalkModePacket.mode)
pInstance->SetStopMode();
else if (WALKMODE_RUN == WalkModePacket.mode)
pInstance->SetRunMode();
else
pInstance->SetWalkMode();
InstanceBaseMovement-ben SetWalkMode függvény után:
void CInstanceBase::SetStopMode()
{
m_GraphicThingInstance.SetStopMode();
}
a header fájlba is írd bele nyilván
ezután ActorInstance-ben SetWalkMode függvény után:
void CActorInstance::SetStopMode()
{
m_bIsStopped;
}
ezt a header fájlbe is
majd ugyanitt __InitializeStateData függvénybe add hozzá
m_bIsStopped = false;
aztán headerjében ezt a változót hozd is létre a m_isWalking változó alá
ezután ugyanebben a Move függvényt keresd meg és a legelejére:
if(m_bIsStopped)
return;
NEM TESZTTELTEM, CSAK NÉZEGETTEM A FORRÁST ÉS ÍGY RANDOM ÖSSZEÍRTAM, HOGY SZERINTEM HOGYAN MEGOLDHATÓ! LEHET KIHAGYTAM VALAMIT, DE VÉLEMÉNYEM SZERINT ÍGY MŰKÖDNIE KELL