void ExpulsarFaccionCaos(int UserIndex, bool Expulsado) { /* '*************************************************** */ /* 'Author: Unknown */ /* 'Last Modification: - */ /* ' 09/28/2010 C4b3z0n - Arreglado RT6 Overflow, el Desequipar() del escudo, ponía de parametro el ObjIndex del escudo en vez del EqpSlot. */ /* '*************************************************** */ UserList[UserIndex].Faccion.FuerzasCaos = 0; /* 'Call PerderItemsFaccionarios(UserIndex) */ if (Expulsado) { WriteConsoleMsg(UserIndex, "¡¡¡Has sido expulsado de la Legión Oscura!!!", FontTypeNames_FONTTYPE_FIGHT); } else { WriteConsoleMsg(UserIndex, "¡¡¡Te has retirado de la Legión Oscura!!!", FontTypeNames_FONTTYPE_FIGHT); } bool bRefresh = false; if (UserList[UserIndex].Invent.ArmourEqpObjIndex != 0) { /* 'Desequipamos la armadura de caos si está equipada */ if (ObjData[UserList[UserIndex].Invent.ArmourEqpObjIndex].Caos == 1) { Desequipar(UserIndex, UserList[UserIndex].Invent.ArmourEqpSlot, false); bRefresh = true; } } if (UserList[UserIndex].Invent.EscudoEqpObjIndex != 0) { /* 'Desequipamos el escudo de caos si está equipado */ if (ObjData[UserList[UserIndex].Invent.EscudoEqpObjIndex].Caos == 1) { Desequipar(UserIndex, UserList[UserIndex].Invent.EscudoEqpSlot, false); bRefresh = true; } } if (bRefresh) { ChangeUserChar(UserIndex, UserList[UserIndex].Char.body, UserList[UserIndex].Char.Head, UserList[UserIndex].Char.heading, UserList[UserIndex].Char.WeaponAnim, UserList[UserIndex].Char.ShieldAnim, UserList[UserIndex].Char.CascoAnim); WriteUpdateUserStats(UserIndex); } /* 'Actualizamos la barca si esta navegando (NicoNZ) */ if (UserList[UserIndex].flags.Navegando) { RefreshCharStatus(UserIndex); } }
void clsParty::ObtenerExito(int ExpGanada, int mapa, int X, int Y) { /* '*************************************************** */ /* 'Author: Unknown */ /* 'Last Modification: 07/04/08 */ /* 'Last Modification By: Marco Vanotti (MarKoxX) */ /* ' - 09/29/07 New formula for calculating the experience point of each user */ /* ' - 09/29/07 Experience is round to the biggest number less than that number */ /* ' - 09/29/07 Now experience is a real-number */ /* ' - 04/04/08 Ahora antes de calcular la experiencia a X usuario se fija si ese usuario existe (MarKoxX) */ /* ' - 07/04/08 New formula to calculate Experience for each user. (MarKoxX) */ /* '*************************************************** */ /* 'Se produjo un evento que da experiencia en la wp referenciada */ int i; int UI; double expThisUser; p_expTotal = p_expTotal + ExpGanada; for (i = (1); i <= (PARTY_MAXMEMBERS); i++) { UI = p_members[i].UserIndex; if (UI > 0) { /* ' Formula: Exp* (Nivel ^ ExponenteNivelParty) / sumadeNivelesElevados */ expThisUser = vb6::CDbl( ExpGanada * (std::pow(UserList[p_members[i].UserIndex].Stats.ELV, ExponenteNivelParty)) / p_SumaNivelesElevados); if (mapa == UserList[UI].Pos.Map && UserList[UI].flags.Muerto == 0) { if (Distance(UserList[UI].Pos.X, UserList[UI].Pos.Y, X, Y) <= PARTY_MAXDISTANCIA) { p_members[i].Experiencia = p_members[i].Experiencia + expThisUser; if (p_members[i].Experiencia < 0) { p_members[i].Experiencia = 0; } if (PARTY_EXPERIENCIAPORGOLPE) { UserList[UI].Stats.Exp = UserList[UI].Stats.Exp + vb6::Fix(expThisUser); if (UserList[UI].Stats.Exp > MAXEXP) { UserList[UI].Stats.Exp = MAXEXP; } CheckUserLevel(UI); WriteUpdateUserStats(UI); } } } } } }
void clsParty::FlushExperiencia() { /* '*************************************************** */ /* 'Author: Unknown */ /* 'Last Modification: 09/29/07 */ /* 'Last Modification By: Lucas Tavolaro Ortiz (Tavo) */ /* ' - 09/29/07 Experience is round to the biggest number less than that number */ /* ' - 09/29/07 Now experience is a real-number */ /* '*************************************************** */ /* 'esta funcion se invoca frente a cerradas del servidor. Flushea la experiencia */ /* 'acumulada a los usuarios. */ int i; /* 'esto sirve SOLO cuando acumulamos la experiencia! */ if (!PARTY_EXPERIENCIAPORGOLPE) { for (i = (1); i <= (PARTY_MAXMEMBERS); i++) { if (p_members[i].UserIndex > 0) { if (p_members[i].Experiencia > 0) { UserList[p_members[i].UserIndex].Stats.Exp = UserList[p_members[i].UserIndex].Stats.Exp + vb6::Fix(p_members[i].Experiencia); if (UserList[p_members[i].UserIndex].Stats.Exp > MAXEXP) { UserList[p_members[i].UserIndex].Stats.Exp = MAXEXP; } CheckUserLevel(p_members[i].UserIndex); } else { if (vb6::Abs(UserList[p_members[i].UserIndex].Stats.Exp) > vb6::Abs(vb6::Fix(p_members[i].Experiencia))) { UserList[p_members[i].UserIndex].Stats.Exp = UserList[p_members[i].UserIndex].Stats.Exp + vb6::Fix(p_members[i].Experiencia); } else { UserList[p_members[i].UserIndex].Stats.Exp = 0; } } p_members[i].Experiencia = 0; WriteUpdateUserStats(p_members[i].UserIndex); } } } }
/* ' @param Cantidad Specifies how many items in that slot are you trying to sell / buy */ void Comercio(eModoComercio Modo, int UserIndex, int NpcIndex, int Slot, int Cantidad) { /* '************************************************* */ /* 'Author: Nacho (Integer) */ /* 'Last modified: 07/06/2010 */ /* '27/07/08 (MarKoxX) | New changes in the way of trading (now when you buy it rounds to ceil and when you sell it rounds to floor) */ /* ' - 06/13/08 (NicoNZ) */ /* '07/06/2010: ZaMa - Los objetos se loguean si superan la cantidad de 1k (antes era solo si eran 1k). */ /* '************************************************* */ int Precio; struct Obj Objeto; if (Cantidad < 1 || Slot < 1) { return; } if (Modo == eModoComercio_Compra) { if (Slot > MAX_INVENTORY_SLOTS) { return; } else if (Cantidad > MAX_INVENTORY_OBJS) { SendData(SendTarget_ToAll, 0, dakara::protocol::server::BuildConsoleMsg( UserList[UserIndex].Name + " ha sido baneado por el sistema anti-cheats.", FontTypeNames_FONTTYPE_FIGHT)); Ban(UserList[UserIndex].Name, "Sistema Anti Cheats", "Intentar hackear el sistema de comercio. Quiso comprar demasiados ítems:" + vb6::CStr(Cantidad)); UserList[UserIndex].flags.Ban = 1; WriteErrorMsg(UserIndex, "Has sido baneado por el Sistema AntiCheat."); FlushBuffer(UserIndex); CloseSocket(UserIndex); return; } else if (!(Npclist[NpcIndex].Invent.Object[Slot].Amount > 0)) { return; } if (Cantidad > Npclist[NpcIndex].Invent.Object[Slot].Amount) { Cantidad = Npclist[UserList[UserIndex].flags.TargetNPC].Invent.Object[Slot].Amount; } Objeto.Amount = Cantidad; Objeto.ObjIndex = Npclist[NpcIndex].Invent.Object[Slot].ObjIndex; /* 'El precio, cuando nos venden algo, lo tenemos que redondear para arriba. */ /* 'Es decir, 1.1 = 2, por lo cual se hace de la siguiente forma Precio = Clng(PrecioFinal + 0.5) Siempre va a darte el proximo numero. O el "Techo" (MarKoxX) */ Precio = vb6::CLng( (ObjData[Npclist[NpcIndex].Invent.Object[Slot].ObjIndex].Valor / Descuento(UserIndex) * Cantidad) + 0.5); if (UserList[UserIndex].Stats.GLD < Precio) { WriteConsoleMsg(UserIndex, "No tienes suficiente dinero.", FontTypeNames_FONTTYPE_INFO); return; } if (MeterItemEnInventario(UserIndex, Objeto) == false) { /* 'Call WriteConsoleMsg(UserIndex, "No puedes cargar mas objetos.", FontTypeNames.FONTTYPE_INFO) */ EnviarNpcInv(UserIndex, UserList[UserIndex].flags.TargetNPC); WriteTradeOK(UserIndex); return; } UserList[UserIndex].Stats.GLD = UserList[UserIndex].Stats.GLD - Precio; QuitarNpcInvItem(UserList[UserIndex].flags.TargetNPC, vb6::CByte(Slot), Cantidad); /* 'Bien, ahora logueo de ser necesario. Pablo (ToxicWaste) 07/09/07 */ /* 'Es un Objeto que tenemos que loguear? */ if (ObjData[Objeto.ObjIndex].Log == 1) { LogDesarrollo( UserList[UserIndex].Name + " compró del NPC " + std::to_string(Objeto.Amount) + " " + ObjData[Objeto.ObjIndex].Name); /* 'Es mucha cantidad? */ } else if (Objeto.Amount >= 1000) { /* 'Si no es de los prohibidos de loguear, lo logueamos. */ if (ObjData[Objeto.ObjIndex].NoLog != 1) { LogDesarrollo( UserList[UserIndex].Name + " compró del NPC " + std::to_string(Objeto.Amount) + " " + ObjData[Objeto.ObjIndex].Name); } } /* 'Agregado para que no se vuelvan a vender las llaves si se recargan los .dat. */ if (ObjData[Objeto.ObjIndex].OBJType == eOBJType_otLlaves) { WriteVar(GetDatPath(DATPATH::NPCs), "NPC" + vb6::CStr(Npclist[NpcIndex].Numero), "obj" + vb6::CStr(Slot), vb6::CStr(Objeto.ObjIndex) + "-0"); logVentaCasa(UserList[UserIndex].Name + " compró " + ObjData[Objeto.ObjIndex].Name); } } else if (Modo == eModoComercio_Venta) { if (Cantidad > UserList[UserIndex].Invent.Object[Slot].Amount) { Cantidad = UserList[UserIndex].Invent.Object[Slot].Amount; } Objeto.Amount = Cantidad; Objeto.ObjIndex = UserList[UserIndex].Invent.Object[Slot].ObjIndex; if (Objeto.ObjIndex == 0) { return; } else if (ObjData[Objeto.ObjIndex].Intransferible == 1 || ObjData[Objeto.ObjIndex].NoComerciable == 1) { WriteConsoleMsg(UserIndex, "No puedes vender este tipo de objeto.", FontTypeNames_FONTTYPE_INFO); return; } else if ((Npclist[NpcIndex].TipoItems != ObjData[Objeto.ObjIndex].OBJType && Npclist[NpcIndex].TipoItems != eOBJType_otCualquiera) || Objeto.ObjIndex == iORO) { WriteConsoleMsg(UserIndex, "Lo siento, no estoy interesado en este tipo de objetos.", FontTypeNames_FONTTYPE_INFO); EnviarNpcInv(UserIndex, UserList[UserIndex].flags.TargetNPC); WriteTradeOK(UserIndex); return; } else if (ObjData[Objeto.ObjIndex].Real == 1) { if (Npclist[NpcIndex].Name != "SR") { WriteConsoleMsg(UserIndex, "Las armaduras del ejército real sólo pueden ser vendidas a los sastres reales.", FontTypeNames_FONTTYPE_INFO); EnviarNpcInv(UserIndex, UserList[UserIndex].flags.TargetNPC); WriteTradeOK(UserIndex); return; } } else if (ObjData[Objeto.ObjIndex].Caos == 1) { if (Npclist[NpcIndex].Name != "SC") { WriteConsoleMsg(UserIndex, "Las armaduras de la legión oscura sólo pueden ser vendidas a los sastres del demonio.", FontTypeNames_FONTTYPE_INFO); EnviarNpcInv(UserIndex, UserList[UserIndex].flags.TargetNPC); WriteTradeOK(UserIndex); return; } } else if (UserList[UserIndex].Invent.Object[Slot].Amount < 0 || Cantidad == 0) { return; } else if (Slot<vb6::LBound(UserList[UserIndex].Invent.Object) || Slot>vb6::UBound(UserList[UserIndex].Invent.Object)) { EnviarNpcInv(UserIndex, UserList[UserIndex].flags.TargetNPC); return; } else if (UserTienePrivilegio(UserIndex, PlayerType_Consejero)) { WriteConsoleMsg(UserIndex, "No puedes vender ítems.", FontTypeNames_FONTTYPE_WARNING); EnviarNpcInv(UserIndex, UserList[UserIndex].flags.TargetNPC); WriteTradeOK(UserIndex); return; } QuitarUserInvItem(UserIndex, Slot, Cantidad); /* 'Precio = Round(ObjData(Objeto.ObjIndex).valor / REDUCTOR_PRECIOVENTA * Cantidad, 0) */ Precio = vb6::Fix(SalePrice(Objeto.ObjIndex) * Cantidad); UserList[UserIndex].Stats.GLD = UserList[UserIndex].Stats.GLD + Precio; if (UserList[UserIndex].Stats.GLD > MAXORO) { UserList[UserIndex].Stats.GLD = MAXORO; } int NpcSlot; NpcSlot = SlotEnNPCInv(NpcIndex, Objeto.ObjIndex, Objeto.Amount); /* 'Slot valido */ if (NpcSlot <= MAX_INVENTORY_SLOTS) { /* 'Mete el obj en el slot */ Npclist[NpcIndex].Invent.Object[NpcSlot].ObjIndex = Objeto.ObjIndex; Npclist[NpcIndex].Invent.Object[NpcSlot].Amount = Npclist[NpcIndex].Invent.Object[NpcSlot].Amount + Objeto.Amount; if (Npclist[NpcIndex].Invent.Object[NpcSlot].Amount > MAX_INVENTORY_OBJS) { Npclist[NpcIndex].Invent.Object[NpcSlot].Amount = MAX_INVENTORY_OBJS; } } /* 'Bien, ahora logueo de ser necesario. Pablo (ToxicWaste) 07/09/07 */ /* 'Es un Objeto que tenemos que loguear? */ if (ObjData[Objeto.ObjIndex].Log == 1) { LogDesarrollo( UserList[UserIndex].Name + " vendió al NPC " + std::to_string(Objeto.Amount) + " " + ObjData[Objeto.ObjIndex].Name); /* 'Es mucha cantidad? */ } else if (Objeto.Amount >= 1000) { /* 'Si no es de los prohibidos de loguear, lo logueamos. */ if (ObjData[Objeto.ObjIndex].NoLog != 1) { LogDesarrollo( UserList[UserIndex].Name + " vendió al NPC " + std::to_string(Objeto.Amount) + " " + ObjData[Objeto.ObjIndex].Name); } } } UpdateUserInv(true, UserIndex, 0); WriteUpdateUserStats(UserIndex); EnviarNpcInv(UserIndex, UserList[UserIndex].flags.TargetNPC); WriteTradeOK(UserIndex); SubirSkill(UserIndex, eSkill_Comerciar, true); }
bool clsParty::SaleMiembro(int UserIndex) { bool retval; /* '*************************************************** */ /* 'Author: Unknown */ /* 'Last Modification: 07/04/08 */ /* 'Last Modification By: Marco Vanotti (MarKoxX) */ /* ' - 09/29/07 Experience is round to the biggest number less than that number */ /* ' - 09/29/07 Now experience is a real-number (Tavo) */ /* ' - 07/04/08 Added const ExponenteNivelParty. (MarKoxX) */ /* '11/03/2010: ZaMa - Ahora no le dice al lider que salio de su propia party, y optimice con with. */ /* '*************************************************** */ /* 'el valor de retorno representa si se disuelve la party */ int i; int j; int MemberIndex; i = 1; retval = false; while (i <= PARTY_MAXMEMBERS && p_members[i].UserIndex != UserIndex) { i = i + 1; } if (i == 1) { /* 'sale el founder, la party se disuelve */ retval = true; MandarMensajeAConsola("El líder disuelve la party.", "Servidor"); for (j = (PARTY_MAXMEMBERS); ((-1) > 0) ? (j <= (1)) : (j >= (1)); j = j + (-1)) { if (p_members[j].UserIndex > 0) { /* ' No envia el mensaje al lider */ if (j != 1) { WriteConsoleMsg(p_members[j].UserIndex, "Abandonas la party liderada por " + UserList[p_members[1].UserIndex].Name + ".", FontTypeNames_FONTTYPE_PARTY); } WriteConsoleMsg(p_members[j].UserIndex, "Durante la misma has conseguido " + vb6::CStr(vb6::Fix(p_members[j].Experiencia)) + " puntos de experiencia.", FontTypeNames_FONTTYPE_PARTY); if (!PARTY_EXPERIENCIAPORGOLPE) { UserList[p_members[j].UserIndex].Stats.Exp = UserList[p_members[j].UserIndex].Stats.Exp + vb6::Fix(p_members[j].Experiencia); if (UserList[p_members[j].UserIndex].Stats.Exp > MAXEXP) { UserList[p_members[j].UserIndex].Stats.Exp = MAXEXP; } CheckUserLevel(p_members[j].UserIndex); WriteUpdateUserStats(p_members[j].UserIndex); } MandarMensajeAConsola(UserList[p_members[j].UserIndex].Name + " abandona la party.", "Servidor"); UserList[p_members[j].UserIndex].PartyIndex = 0; p_CantMiembros = p_CantMiembros - 1; p_SumaNivelesElevados = p_SumaNivelesElevados - std::pow(UserList[UserIndex].Stats.ELV, ExponenteNivelParty); p_members[j].UserIndex = 0; p_members[j].Experiencia = 0; } } } else { if (i <= PARTY_MAXMEMBERS) { MemberIndex = p_members[i].UserIndex; if (!PARTY_EXPERIENCIAPORGOLPE) { UserList[MemberIndex].Stats.Exp = UserList[MemberIndex].Stats.Exp + vb6::Fix(p_members[i].Experiencia); if (UserList[MemberIndex].Stats.Exp > MAXEXP) { UserList[MemberIndex].Stats.Exp = MAXEXP; } CheckUserLevel(MemberIndex); WriteUpdateUserStats(MemberIndex); } MandarMensajeAConsola(UserList[MemberIndex].Name + " abandona la party.", "Servidor"); /* 'TODO: Revisar que esto este bien, y no este faltando/sobrando un mensaje, ahora solo los estoy corrigiendo */ WriteConsoleMsg(MemberIndex, "Durante la misma has conseguido " + vb6::CStr(vb6::Fix(p_members[i].Experiencia)) + " puntos de experiencia.", FontTypeNames_FONTTYPE_PARTY); p_CantMiembros = p_CantMiembros - 1; p_SumaNivelesElevados = p_SumaNivelesElevados - std::pow(UserList[UserIndex].Stats.ELV, ExponenteNivelParty); MemberIndex = 0; p_members[i].Experiencia = 0; p_members[i].UserIndex = 0; CompactMemberList(); } } return retval; }