Karakter mozgás tiltása

Indította Deangerious, 2018-02-28, 10:19:47

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
Az ember csak fiatalon találhat ki igazán új dolgokat. Utána már túl tapasztalt, túl híres (...) és túl ostoba.

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

C++ programmer at Gameloft

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.

2018-03-02, 11:41:38 #9 Utolsó szerkesztés: 2018-03-02, 14:46:09 Szerző: Distraught
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

C++ programmer at Gameloft