Metin2 Hungarian Forum

Metin2 => Szerver készítés => Privát szerverek => Segítség => A témát indította: Deangerious Dátum 2018-02-28, 10:19:47

Cím: Karakter mozgás tiltása
Írta: Deangerious Dátum 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?
Cím: Re:Karakter mozgás tiltása
Írta: 5310pati Dátum 2018-02-28, 10:55:33
Há mé akarod csóri játékost lebénítani x szint felett? :'( :'(
Cím: Re:Karakter mozgás tiltása
Írta: Deangerious Dátum 2018-02-28, 11:29:50
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?
Cím: Re:Karakter mozgás tiltása
Írta: Lincoln Dátum 2018-02-28, 15:55:52
Kaphat mozgási sebességet is az illető bónusz gyanánt pár perc erejéig :D
(Questes megoldás)
Cím: Re:Karakter mozgás tiltása
Írta: TheSLESH Dátum 2018-02-28, 18:03:09
http://metin2hungary.net/index.php/topic,200409.0.html

+

minusz mozgási sebesség

=
Megoldás
Cím: Re:Karakter mozgás tiltása
Írta: DAtiv Dátum 2018-02-28, 21:46:41
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
Cím: Re:Karakter mozgás tiltása
Írta: Deangerious Dátum 2018-03-01, 06:30:23
Köszi szépen a válaszokat és a példákat. :-)
Cím: Re:Karakter mozgás tiltása
Írta: Distraught Dátum 2018-03-01, 19:36:20
szerintem a SendMovePacket függvénybe tedd az ellenőrzést
Cím: Re:Karakter mozgás tiltása
Írta: Deangerious Dátum 2018-03-02, 06:39:55
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.
Cím: Re:Karakter mozgás tiltása
Írta: Distraught Dátum 2018-03-02, 11:41:38
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
EhPortal 1.39 © 2025, WebDev