Solo usuarios registrados pueden comentar y agradecer, Logueate o Registrate

Autor Topic: MuEmu - Source Louis Emulator S6 (update 13) - Custom Wings Precio  (Visto 2087 veces)

0 Miembros and 1 Guest are viewing this topic.

Offline zedia93 Posteado: March 24, 2020, 04:50:33 PM

  • 0 puntos por ventas
  • *
  • Rank: Principiante
  • Posts: 21
  • Gracias recibida: 12
  • ve
Estimados estoy intentando trabajar los Source de Louis  up 13 estoy agregando Wings pero he notado que a partir del index 255 aunque las Wings se agregar puesto que el maximo de custom esta en 100 no hay problema. El inconveniente surge a la hora de querer vender el item se vende normal pero por alguna razón el main no logra obtener el precio queda en loading... 

Intente editar el archivo ItemValue pero no tiene efecto creo que puede ser un problema con el GameServer o no se si es el mismo Main les agradecería su apoyo.

Nota: todas las wings desde 1 - 255 se puede ver el precio normal de la 256 para arriba nada.




Gracias:


Offline carlos243 #1 Posteado: March 24, 2020, 08:59:44 PM

  • 0 puntos por ventas
  • *
  • Rank: Dedicado
  • Posts: 44
  • Gracias recibida: 172
  • ve
el problema esta que el item cuando vale mucho no se puede debes acomodar el precio dejame que me recuerde donde es que era yo logre resolver eso pero ahora no recuerdo dejame hechar cabeza y te dejo una nota


Offline zedia93 #2 Posteado: March 24, 2020, 10:08:15 PM

  • 0 puntos por ventas
  • *
  • Rank: Principiante
  • Posts: 21
  • Gracias recibida: 12
  • ve
el problema esta que el item cuando vale mucho no se puede debes acomodar el precio dejame que me recuerde donde es que era yo logre resolver eso pero ahora no recuerdo dejame hechar cabeza y te dejo una nota
jajaja me dejaste en la misma pero gracias por responder...


Offline zedia93 #3 Posteado: March 25, 2020, 08:58:28 PM

  • 0 puntos por ventas
  • *
  • Rank: Principiante
  • Posts: 21
  • Gracias recibida: 12
  • ve
Bueno para el que pueda interesar ya pude solventar este inconveniente que venia presentando. Como intuí la problemática radica en el main, el servidor funciona perfectamente explico un poco la solución o al menos la que le pude encontrar.

Nota: cabe acotar que para solventar dicha problemática necesariamente debemos trabajar el source del Main de otra manera es imposible.

el origen del error radica en este archivo ItemShopValue.cpp específicamente en la función SetPriceRecv la cual es la encargada de recibir los datos del cliente.
 
Code: [Select]

int ItemPrice::SetPriceRecv(int a1,int a2)
{
   int ItemId      = *(WORD*)a1;
        int ItemLvl      = *(int*)(a1+2);
   int ItemDur   = *(char*)(a1+22);
   int ItemNewOpt   = *(char*)(a1+23);   

   if(a2 == 1)
   {
      if(gItemPrice.sellprice != 0)
         return (gItemPrice.GetPrice(ItemId,ItemLvl,ItemNewOpt,ItemDur,1));
      else
         return (gItemPrice.GetPrice(ItemId,ItemLvl,ItemNewOpt,ItemDur,1)/3);
   }
   else
   {
      return gItemPrice.GetPrice(ItemId,ItemLvl,ItemNewOpt,ItemDur,0);

   }
}


Al recibir el dato de las opciones exe del cliente en la varibale ItemNewOpt si el indice que declaramos en el archivo ítem del server y cliente sobre pasa los 255 automáticamente el valor que devuelve ( *(char*)(a1+23) )  es negativo ( si el item no tiene opciones quedaría en -128)  esto posteriormente genera el error al obtener el precio del item en la función ItemPrice::GetPrice al comprar el listado de items y precios que envió el servior con el item que envia el cliente no encuentra coincidencias entre el this->m_ItemPrice[n].Newopt(SE CARGO DEL SERVIDOR) y el newopt(que envía el cliente).

Code: [Select]

int ItemPrice::GetPrice(int index,int level,int newopt,int dur,int buysell)
{
...

if (this->m_ItemPrice[n].ItemIndex == index && this->m_ItemPrice[n].Level == level && this->m_ItemPrice[n].Newopt == newopt && this->m_ItemPrice[n].BuySell == buysell)

}


De aquí que se crea un Bucle infinito en la funcion ItemPrice::ShowSellPrice buscando una coincidencia con el item con la opcion en negativo.

Code: [Select]
void ItemPrice::ShowSellPrice(DWORD a1, const char *a2, char *Price)
{
   if(strcmp("0",Price) == 0)
   {
      if (gItemPrice.load == 1)
      {
         pSetItemTextLine(a1,"Loading ..");
         gItemPrice.load = 2;
      }
      else if(gItemPrice.load == 2)
      {
         pSetItemTextLine(a1,"Loading ...");
         gItemPrice.load = 3;
      }
      else if(gItemPrice.load == 3)
      {
         pSetItemTextLine(a1,"Loading ....");
         gItemPrice.load = 4;
      }
      else if(gItemPrice.load == 4)
      {
         pSetItemTextLine(a1,"Loading .....");
         gItemPrice.load = 0;
      }
      else
      {
         pSetItemTextLine(a1,"Loading .");
         gItemPrice.load = 1;
      }
   }
   else
   {
      if (gItemPrice.type == 1 && gItemPrice.sellprice > 0)
      {
         pSetItemTextLine(a1,gCustomMessage.GetMessage(55),Price);
      }
      else if (gItemPrice.type == 2 && gItemPrice.sellprice > 0)
      {
         pSetItemTextLine(a1,gCustomMessage.GetMessage(56),Price);
      }
      else if (gItemPrice.type == 3 && gItemPrice.sellprice > 0)
      {
         pSetItemTextLine(a1,gCustomMessage.GetMessage(57),Price);
      }
      else
      {
         pSetItemTextLine(a1,gCustomMessage.GetMessage(49),Price);
      }
   }
}

EN CONCLUSIÓN pude encontrar 2 soluciones la primera y más sencilla sería eliminar la comparación  this->m_ItemPrice[n].Newopt == newopt en la función ItemPrice::GetPrice y eso automáticamente elimina el problema. Sin embargo no tengo idea que problema pueda ocasionar el remover esa comparación
Por tanto ese me lleva a la segunda opción que es la que yo tome y fue generar una función que detecte si el indice del ítem es mayor a 255 y si es así en la función  ItemPrice::SetPriceRecv sumarle 128 a la varibale ItemNewOpt y eso compensaría el desbalance que se genera si el index es mayor a 255 

Code: [Select]

int ItemPrice::SetPriceRecv(int a1,int a2)
{
   int ItemId      = *(WORD*)a1;
   int ItemLvl      = *(int*)(a1+2);
   int ItemDur   = *(char*)(a1+22);
   int ItemNewOpt   = *(char*)(a1+23);   

   if(IsMaxIndex(ItemId)){
      ItemNewOpt = (ItemNewOpt + 128);
   }

   if(a2 == 1)
   {
      if(gItemPrice.sellprice != 0)
         return (gItemPrice.GetPrice(ItemId,ItemLvl,ItemNewOpt,ItemDur,1));
      else
         return (gItemPrice.GetPrice(ItemId,ItemLvl,ItemNewOpt,ItemDur,1)/3);
   }
   else
   {
      return gItemPrice.GetPrice(ItemId,ItemLvl,ItemNewOpt,ItemDur,0);

   }
}



Hasta ahora me ha funcionado... si alguien conoce alguna otra manera le rogaría me la hiciera saber... estoy aprendiendo a trabajar sources cualquier comentario positivo sera bien recibido.

Gracias:


Offline Evangelio #4 Posteado: September 16, 2023, 07:35:12 PM

  • 0 puntos por ventas
  • *
  • Rank: Heroe
  • Posts: 172
  • Gracias recibida: 763
  • ar
Bueno para el que pueda interesar ya pude solventar este inconveniente que venia presentando. Como intuí la problemática radica en el main, el servidor funciona perfectamente explico un poco la solución o al menos la que le pude encontrar.

Nota: cabe acotar que para solventar dicha problemática necesariamente debemos trabajar el source del Main de otra manera es imposible.

el origen del error radica en este archivo ItemShopValue.cpp específicamente en la función SetPriceRecv la cual es la encargada de recibir los datos del cliente.
 
Code: [Select]

int ItemPrice::SetPriceRecv(int a1,int a2)
{
   int ItemId      = *(WORD*)a1;
        int ItemLvl      = *(int*)(a1+2);
   int ItemDur   = *(char*)(a1+22);
   int ItemNewOpt   = *(char*)(a1+23);   

   if(a2 == 1)
   {
      if(gItemPrice.sellprice != 0)
         return (gItemPrice.GetPrice(ItemId,ItemLvl,ItemNewOpt,ItemDur,1));
      else
         return (gItemPrice.GetPrice(ItemId,ItemLvl,ItemNewOpt,ItemDur,1)/3);
   }
   else
   {
      return gItemPrice.GetPrice(ItemId,ItemLvl,ItemNewOpt,ItemDur,0);

   }
}


Al recibir el dato de las opciones exe del cliente en la varibale ItemNewOpt si el indice que declaramos en el archivo ítem del server y cliente sobre pasa los 255 automáticamente el valor que devuelve ( *(char*)(a1+23) )  es negativo ( si el item no tiene opciones quedaría en -128)  esto posteriormente genera el error al obtener el precio del item en la función ItemPrice::GetPrice al comprar el listado de items y precios que envió el servior con el item que envia el cliente no encuentra coincidencias entre el this->m_ItemPrice[n].Newopt(SE CARGO DEL SERVIDOR) y el newopt(que envía el cliente).

Code: [Select]

int ItemPrice::GetPrice(int index,int level,int newopt,int dur,int buysell)
{
...

if (this->m_ItemPrice[n].ItemIndex == index && this->m_ItemPrice[n].Level == level && this->m_ItemPrice[n].Newopt == newopt && this->m_ItemPrice[n].BuySell == buysell)

}


De aquí que se crea un Bucle infinito en la funcion ItemPrice::ShowSellPrice buscando una coincidencia con el item con la opcion en negativo.

Code: [Select]
void ItemPrice::ShowSellPrice(DWORD a1, const char *a2, char *Price)
{
   if(strcmp("0",Price) == 0)
   {
      if (gItemPrice.load == 1)
      {
         pSetItemTextLine(a1,"Loading ..");
         gItemPrice.load = 2;
      }
      else if(gItemPrice.load == 2)
      {
         pSetItemTextLine(a1,"Loading ...");
         gItemPrice.load = 3;
      }
      else if(gItemPrice.load == 3)
      {
         pSetItemTextLine(a1,"Loading ....");
         gItemPrice.load = 4;
      }
      else if(gItemPrice.load == 4)
      {
         pSetItemTextLine(a1,"Loading .....");
         gItemPrice.load = 0;
      }
      else
      {
         pSetItemTextLine(a1,"Loading .");
         gItemPrice.load = 1;
      }
   }
   else
   {
      if (gItemPrice.type == 1 && gItemPrice.sellprice > 0)
      {
         pSetItemTextLine(a1,gCustomMessage.GetMessage(55),Price);
      }
      else if (gItemPrice.type == 2 && gItemPrice.sellprice > 0)
      {
         pSetItemTextLine(a1,gCustomMessage.GetMessage(56),Price);
      }
      else if (gItemPrice.type == 3 && gItemPrice.sellprice > 0)
      {
         pSetItemTextLine(a1,gCustomMessage.GetMessage(57),Price);
      }
      else
      {
         pSetItemTextLine(a1,gCustomMessage.GetMessage(49),Price);
      }
   }
}

EN CONCLUSIÓN pude encontrar 2 soluciones la primera y más sencilla sería eliminar la comparación  this->m_ItemPrice[n].Newopt == newopt en la función ItemPrice::GetPrice y eso automáticamente elimina el problema. Sin embargo no tengo idea que problema pueda ocasionar el remover esa comparación
Por tanto ese me lleva a la segunda opción que es la que yo tome y fue generar una función que detecte si el indice del ítem es mayor a 255 y si es así en la función  ItemPrice::SetPriceRecv sumarle 128 a la varibale ItemNewOpt y eso compensaría el desbalance que se genera si el index es mayor a 255 

Code: [Select]

int ItemPrice::SetPriceRecv(int a1,int a2)
{
   int ItemId      = *(WORD*)a1;
   int ItemLvl      = *(int*)(a1+2);
   int ItemDur   = *(char*)(a1+22);
   int ItemNewOpt   = *(char*)(a1+23);   

   if(IsMaxIndex(ItemId)){
      ItemNewOpt = (ItemNewOpt + 128);
   }

   if(a2 == 1)
   {
      if(gItemPrice.sellprice != 0)
         return (gItemPrice.GetPrice(ItemId,ItemLvl,ItemNewOpt,ItemDur,1));
      else
         return (gItemPrice.GetPrice(ItemId,ItemLvl,ItemNewOpt,ItemDur,1)/3);
   }
   else
   {
      return gItemPrice.GetPrice(ItemId,ItemLvl,ItemNewOpt,ItemDur,0);

   }
}



Hasta ahora me ha funcionado... si alguien conoce alguna otra manera le rogaría me la hiciera saber... estoy aprendiendo a trabajar sources cualquier comentario positivo sera bien recibido.

IntelliSense: el identificador "IsMaxIndex" no está definido


Solo usuarios registrados pueden comentar y agradecer, Logueate o Registrate


 

Related Topics

  Subject / Started by Replies Last post
89 Replies
21985 Views
Last post November 20, 2021, 04:00:17 PM
by djagripnos
211 Replies
33979 Views
Last post August 27, 2023, 01:38:23 AM
by OBBY
54 Replies
11390 Views
Last post October 29, 2019, 11:10:42 AM
by hiep
3 Replies
1877 Views
Last post February 28, 2020, 11:17:49 PM
by ConejoMalo
0 Replies
111 Views
Last post September 16, 2023, 03:55:46 PM
by Evangelio