Example #1
0
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);
	}

}
Example #2
0
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);
					}
				}
			}
		}
	}

}
Example #3
0
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);
			}
		}
	}

}
Example #4
0
/* ' @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);
}
Example #5
0
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;
}