Noticias:

SMF - Just Installed!

Menú principal

SOURCE Corregir Precio Custom Wings

Publicado por Dakosmu, Mayo 07, 2023, 08:57 AM

Tema anterior - Siguiente tema

Dakosmu

INFORMACION

Citado @zedia93:

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...

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

IMAGENES/VIDEOS
Los visitantes no pueden visualizar imágenes en los mensajes, por favor Regístrate o Inicia Sesión


CODIGO CON EL ERROR

ItemShopValue.cpp:
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).

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.


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.



//////////// SOLUCION////////////


You require the following to view this post content:
  • You require a post count of at least 5, you need another 5 posts.



COMO COLOCAR LOS CODIGOS

Primero Busca el Codigo "int ItemPrice::SetPriceRecv(int a1,int a2)" en ItemShopValue.cpp

Los visitantes no pueden visualizar imágenes en los mensajes, por favor Regístrate o Inicia Sesión


Seleccionas todo el codigo

Los visitantes no pueden visualizar imágenes en los mensajes, por favor Regístrate o Inicia Sesión


y Lo remplazas completo

Los visitantes no pueden visualizar imágenes en los mensajes, por favor Regístrate o Inicia Sesión





Codigo takumi
SetCompleteHook(0xE8, 0x00847713, &this->SetPriceRecv); //-- agregar este nuevo]

Otros temas que no tiene nada que ver con la guia

int ItemNewOpt = * (BYTE*)(a1 + 23);
cambair eso
y eliminar ese maxiindex>255
]

int ItemNewOpt = (* (BYTE*)(a1 + 23))&63;]

antes del renderizado:
EnableAlphaTest(TRUE);
glColor4f(1.0, 1.0, 1.0, 1.0);]


[spoiler]Los visitantes no pueden visualizar imágenes en los mensajes, por favor Regístrate o Inicia Sesión
[/spoiler]


CREDITOS
takumi

zedia93
Bon Dia

🡱 🡳