MU PLUGIN

Framework MMORPG inspirado en MU Online. Servidor autoritativo, basado en DataTables, listo para multijugador.

20+ SistemasMultijugadorBasado en DataTableSistema de EventosUE 5.6+

๐Ÿ“ฆ Instalacion

1
Copia la carpeta Mu_Plugin dentro de la carpeta Plugins/ de tu proyecto.
2
Abre tu proyecto. El plugin se carga automaticamente. Veras "MU Plugin module started" en el log.
3
Crea tus DataTables (Items, Clases, Habilidades, Botin) siguiendo la guia de abajo.
No se requieren cambios en clases base. Puedes usar AMuCharacter directamente o agregar componentes Mu a tu propio personaje.

๐Ÿš€ Inicio Rapido (3 Pasos)

1
Coloca AMuCharacter en tu nivel. En el panel de Detalles, configura Spawned Class como "Dark Knight" (o cualquier clase). Ya incluye Stats, Inventario y Habilidades integrados, mas una camara en tercera persona.
2
Crea tus DataTables. Clic derecho en el Content Browser > Miscellaneous > DataTable. Elige MuItemRow para items, MuClassRow para clases, MuSkillRow para habilidades. Rellena los campos.
3
Asigna las tablas. Selecciona tu AMuCharacter, expande el componente MuStats, configura Class Table. Expande MuInventory, configura Item Table. Expande MuSkills, configura Skill Table. Dale Play!
Todo es servidor autoritativo. Todas las funciones de gameplay verifican HasAuthority() y replican los resultados. Tu te enfocas en el gameplay, no en la red.

๐Ÿ“Š Configurar DataTables

El plugin esta 100% basado en DataTables. Sin valores fijos en codigo. Crea estas tablas para definir el contenido de tu juego:

DT_Items (estructura: FMuItemRow)

Cada item del juego: armas, armaduras, consumibles, joyas, items de mision. RowName = ID del item (ej. "WPN_Espada_Hierro").

DisplayName, DescriptionFText
ItemTypeArma / Casco / Armadura / Consumible / Joya / ...
RarityNormal / Magico / Excelente / Antiguo / Mitico / Set
EquipSlotManoPrincipal / ManoSecundaria / Casco / Armadura / Alas / Anillo1 / ...
Icon, WorldMesh, EquippedMesh, AttachSocketVisuales
MaxStack, BuyPrice, SellPriceEconomia
RequiredLevel, RequiredStrength/Agility/EnergyRequisitos
AllowedClassesVacio = cualquiera puede usarlo
MinDamage, MaxDamage, Defense, AttackSpeedCombate
bTwoHandedBloquea ManoSecundaria al equipar
BonusMaxHealth/Mana/Stamina/ShieldBonificaciones de equipo
HealAmount, ManaAmount, CooldownUso de consumible
DT_Classes (estructura: FMuClassRow)

Clases de personaje. El RowName debe coincidir con el enum: "DarkKnight", "DarkWizard", "FairyElf", etc.

AllowedSkillTagsMascara de bits: Melee, Magic, Holy, Dark, Summon, etc.
StartStrength/Agility/Vitality/Energy/CommandStats nivel 1
StatPointsPerLevelPuntos ganados al subir de nivel
HealthPerVitality, ManaPerEnergy, StaminaPerVitalityEscalado
BaseHealth, BaseMana, BaseStaminaRecursos nivel 1
CharacterMesh, AnimBlueprintVisuales por clase
StartingItems, StartingGoldEquipamiento inicial
DT_Skills (estructura: FMuSkillRow)

Habilidades/hechizos. RowName = ID de habilidad (ej. "SK_BolaDeFuego").

RequiredTagsMascara de bits: la clase debe tener TODOS estos tags para lanzar
AllowedClassesRestriccion adicional (vacio = solo por tags)
ManaCost, StaminaCost, CooldownCoste de lanzamiento
BaseDamage, ScalingStat, StatMultiplierFormula de dano
Range, AreaRadiusObjetivo unico o area (AoE)
CastMontage, CastVFX, CastSoundCosmetico (lo reproduce TU Blueprint)
Bloqueo por Tags de Clase: Un DarkWizard con tags Magic|AoE puede lanzar una bola de fuego (RequiredTags=Magic). Un DarkKnight con tags Melee|AoE no puede. Asi evitas que "todos lancen todo".
DT_Loot (estructura: FMuLootRow)
Entries[]ItemId + DropChance (0-1) + MinQty + MaxQty + UpgradeLevel
MinGold, MaxGoldRango de oro que suelta

โค๏ธ Estadisticas y Recursos

โค๏ธMuStatsComponent
MULTIJUGADORAUTO-REGEN
HP, Mana, Stamina, Escudo (SD), Nivel/XP, stats primarios (Str/Agi/Vit/Ene/Cmd). Servidor autoritativo con temporizador de regeneracion automatica.
Configurar en el panel de Detalles
Class TableDataTable de FMuClassRowobligatorio
Xp ThresholdsXP necesaria por nivel (array)[0,200,600...]
Regen IntervalSegundos entre ticks de regeneracion3.0
Mana Regen DivisorRegen mana = MaxMana / esto27.5
Stamina Regen Per Tick5.0
Shield Regen Per TickSolo en zonas seguras25.0
Funciones Blueprint
Initialize From Classโ†’ configura clase + nivel, llena stats desde ClassTable
Apply Damage(Cantidad, Tipo, Causante) โ†’ dano infligido (el escudo absorbe primero)
Apply Heal(Cantidad) โ†’ HP restaurado
Restore Mana / Restore Staminaโ†’ uso de pociones
Consume Mana / Consume Stamina(Cantidad) โ†’ true si alcanza
Revive(PorcentajeHP) โ†’ resucitar con el % indicado
Allocate Stat Point(Stat, Cantidad) โ†’ true si tenia puntos
Add Experience(CantidadXP) โ†’ sube de nivel automaticamente
Set In Safe Zone(bool) โ†’ activa regeneracion de escudo
Is Dead / Get Health / Get Max Health / Get Level / ...โ†’ consultas
Eventos (enlazar en Blueprint)
On Health Changed (NuevoValor, ValorMaximo) - actualizar barra de HP
On Mana Changed (NuevoValor, ValorMaximo) - actualizar barra de MP
On Stamina Changed (NuevoValor, ValorMaximo)
On Shield Changed (NuevoValor, ValorMaximo) - barra de SD
On Level Changed (NuevoNivel)
On Experience Changed (NuevaXP) - actualizar barra de experiencia
On Died - reproducir animacion de muerte, mostrar UI de respawn
On Revived - ocultar pantalla de muerte
On Damaged (Cantidad, TipoDano, Causante) - mostrar numero de dano
El escudo absorbe primero. Como en MU Online: el SD recibe el golpe antes que el HP. El tipo de dano Puro ignora tanto la defensa como el escudo.

๐ŸŽ’ Inventario y Equipamiento

๐ŸŽ’MuInventoryComponent
MULTIJUGADORRPCs SERVIDOR
Mochila basada en lista (64 espacios por defecto = cuadricula 8x8), ranuras de equipo, oro (zen). Los clientes llaman RPCs del servidor, el servidor valida y modifica.
Configurar en el panel de Detalles
Item TableDataTable de FMuItemRowobligatorio
CapacityEspacios maximos de la mochila64
World Item ClassActor que aparece al soltarAMuWorldItem
Funciones Blueprint (servidor)
Add Item(ItemId, Cantidad, NivelMejora) โ†’ sobrante que no cupo
Remove Item By Id / Remove Item Atโ†’ cantidad removida
Use Item At(Indice) โ†’ consumibles: cura HP/Mana automaticamente
Equip Item At(IndiceMochila) โ†’ verifica requisitos, aplica bonificaciones a Stats
Unequip Slot(Ranura) โ†’ el item vuelve a la mochila
Add Gold(Delta) โ†’ positivo = ganar, negativo = gastar
Validate Equipmentโ†’ desequipa items cuyos requisitos ya no se cumplen
Find Item Row BP(ItemId) โ†’ estructura FMuItemRow
RPCs de Cliente (llamar desde la interfaz)
Server Use Item (Indice) - usar consumible
Server Equip Item (IndiceMochila) - equipar desde la mochila
Server Unequip Slot (Ranura) - desequipar a la mochila
Server Drop Item (IndiceMochila, Cantidad) - soltar en el mundo
Server Move Item (IndiceOrigen, IndiceDestino) - reorganizar mochila
Eventos
On Inventory Changed - refrescar UI de la mochila
On Gold Changed (NuevoOro) - actualizar display de oro
On Equipment Changed (Ranura, NuevoItem) - refrescar muneco de papel
Armas a Dos Manos: Al equipar un arma 2M (bTwoHanded=true), la mano secundaria se libera automaticamente. No puedes equipar un escudo mientras sostienes un arma a dos manos.

๐Ÿ”ฎ Habilidades y Clases

๐Ÿ”ฎMuSkillComponent
MULTIJUGADORRPC SERVIDOR
Sistema de habilidades con bloqueo por tags de clase, enfriamientos, AoE y multicast cosmetico.
Funciones Blueprint
Can Cast(SkillId) โ†’ EMuCastResult (Exito/ClaseErronea/FaltaMana/EnEnfriamiento/...)
Can Cast On(SkillId, Objetivo) โ†’ + verificacion de alcance
Execute Skill(SkillId, Objetivo) โ†’ paga coste, inicia enfriamiento, aplica dano, envia info de VFX a todos los clientes
Get Remaining Cooldown(SkillId) โ†’ segundos restantes
Is On Cooldown(SkillId) โ†’ true/false
RPC de Cliente
Server Request Cast (SkillId, Objetivo) - llamar desde el input
Eventos
On Skill Cast (SkillId, Resultado) - mostrar feedback "no hay mana suficiente"
On Skill Effect (FMuSkillCastInfo) - se dispara en TODOS los clientes! Reproduce VFX/Montage/Sonido aqui
Formula de dano: DanoTotal = BaseDamage + (valor del ScalingStat * StatMultiplier). AoE golpea a todos los peones dentro de AreaRadius alrededor del objetivo.

๐Ÿง™ Personaje y Cuerpo a Cuerpo

๐Ÿง™AMuCharacter
MULTIJUGADORAUTO-SETUP
Personaje listo para usar con Stats + Inventario + Habilidades + camara. Se auto-inicializa desde SpawnedClass, otorga items iniciales, aplica mesh/AnimBP de clase, conecta auto-attach de equipo.
Configurar en el panel de Detalles
Spawned ClassClase con la que inicializarDarkKnight
Spawned Level1
Unarmed Min/Max DamageSin arma equipada1/3
Strength Damage BonusStr * esto se suma al dano cuerpo a cuerpo0.5
Melee Range200 cm
Funciones Blueprint
Do Melee Attack(Objetivo) โ†’ dano infligido (stats arma + bonus Str - Defensa objetivo)
Can Melee Attackโ†’ true si esta vivo + fuera de enfriamiento
Toggle Flightโ†’ cambiar caminar/volar (necesita alas + zona de vuelo)
Has Wings / Is Flying / Is Flight Allowedโ†’ consultas
RPCs de Cliente
Server Request Melee Attack (Objetivo)
Server Toggle Flight
Auto-attach de equipo: Items con EquippedMesh + AttachSocket generan automaticamente un mesh al equipar y lo eliminan al desequipar. No necesitas conectar nada en BP para que armas/escudos/alas aparezcan en el personaje.

๐Ÿ’Ž Botin y Drops

๐Ÿ’ŽMuLootComponent + AMuWorldItem
MULTIJUGADORAUTO-DROP
Agrega a enemigos. Cuando mueren, el botin cae automaticamente como pickups en el mundo. Camina sobre un pickup para recogerlo.
Configurar en el actor enemigo
Loot TableDataTable de FMuLootRowobligatorio
Loot Row IdRowName a usar
World Item ClassAMuWorldItem o subclase
Spawn On Owner DeathDrops automaticostrue
Drop Scatter Radius80
Funciones Blueprint
Roll Dropsโ†’ devuelve items[] + oro (sin generar en el mundo)
Spawn Drops In World(Ubicacion, Radio) โ†’ tira dados + genera pickups
La recogida es automatica. AMuWorldItem tiene un overlap de esfera. Cuando un personaje camina sobre el, los items van directo a su inventario. Si la mochila esta llena, el pickup se queda en el suelo.

๐Ÿช Tienda NPC

๐ŸชAMuShopNPC
MULTIJUGADORRPCs SERVIDOR
NPC vendedor. Compra items por oro, vende de vuelta con un multiplicador. Tiendas restringidas por clase posibles.
Funciones Blueprint
Buy Item(InventarioComprador, ItemId, Cantidad) โ†’ valida oro, espacio, clase
Sell Item(InventarioVendedor, IndiceMochila, Cantidad) โ†’ remueve item, agrega oro * SellbackMultiplier
RPCs de Cliente
Server Buy Item / Server Sell Item - llamar desde la UI de tienda

๐Ÿ“ฆ Boveda / Cofre

๐Ÿ“ฆAMuStorageActor
MULTIJUGADORGUARDABLE
Almacenamiento persistente. Boveda personal (bloqueada por dueno) o cofre compartido en el mundo. Guardable via PersistenceId.
Funciones Blueprint
Deposit(InvJugador, IndiceMochila, Cantidad) โ†’ mueve item de mochila al almacen
Withdraw(InvJugador, IndiceAlmacen, Cantidad) โ†’ mueve item del almacen a la mochila
Eventos
On Storage Changed - refrescar UI del cofre

๐Ÿ‘พ Generador de Monstruos

๐Ÿ‘พMuMonsterSpawnerComponent
SOLO SERVIDORNAVMESH
Coloca en un TriggerBox. Genera monstruos aleatorios con peso dentro del volumen, sobre NavMesh, con trazado al suelo. Mantiene la poblacion con respawns.
Configurar en el panel de Detalles
Monster Entries[]Clase + Peso + NivelOverrideobligatorio
Spawn CountObjetivo de poblacion viva5
Respawn Delay30s
Use NavMeshSolo generar donde la IA puede caminartrue
Destroy Dead MonstersLimpiar cadaveres automaticamentetrue
Corpse LifetimeSegundos antes de que desaparezca el cadaver5
Funciones Blueprint
Start Spawning / Stop Spawningโ†’ control manual
Kill All Spawnedโ†’ eliminar todos los monstruos vivos
Get Alive Count / Get Alive Monsters
Eventos
On Monster Spawned (Monstruo) - aplicar logica personalizada
On Monster Died (Monstruo) - reproducir VFX de muerte

โญ Como Hacer que tu Personaje Vuele (Guia Rapida)

๐Ÿš€5 Pasos para Volar
PARA PRINCIPIANTES
Sigue estos 5 pasos y tu personaje estara volando en minutos. No necesitas programar nada en C++, todo se hace en el Editor de Unreal.
Paso a paso
1
Crea una DataTable de Items โ€” En el Content Browser, clic derecho โ†’ Miscellaneous โ†’ DataTable. Elige la estructura FMuItemRow. Nombra la tabla DT_Items.
2
Agrega un item de alas โ€” Abre DT_Items, agrega una nueva fila. Pon un nombre como "Wings_Basic". Configura estos campos:
โ€ข ItemType = Equipment
โ€ข EquipSlot = Wings
โ€ข DisplayName = "Alas Basicas" (o el nombre que quieras)
โ€ข EquippedMesh = selecciona el mesh 3D de tus alas (un Static Mesh)
โ€ข AttachSocket = spine_03 (o el socket donde quieres las alas en la espalda)
Los demas campos puedes dejarlos en sus valores por defecto.
3
Conecta la DataTable al Inventario โ€” Selecciona tu personaje AMuCharacter en el nivel (o en su Blueprint). En el panel de Detalles, busca el componente MuInventory y asigna tu DT_Items en el campo Item Table.
4
Coloca un AMuFlightZoneVolume โ€” Arrastra un AMuFlightZoneVolume desde el panel Place Actors a tu nivel. Hazlo grande para cubrir el area donde quieres permitir el vuelo. En sus detalles, asegurate de que Allow Flight = true.
5
Dale las alas al personaje โ€” En el Blueprint de tu personaje (o en el GameMode), al iniciar el juego llama a estas dos funciones:
โ€ข Get Inventory โ†’ Add Item (ItemId = "Wings_Basic", Quantity = 1)
โ€ข Get Inventory โ†’ Equip Item At (Slot = Wings)
ยกListo! Al entrar en la zona de vuelo, tu personaje levitara automaticamente.
ยกYa vuela! Si todo esta correcto, al jugar (Play) veras a tu personaje flotando con un suave balanceo sinusoidal dentro de la zona de vuelo. Las alas apareceran automaticamente en su espalda.
ยฟNo funciona? Verifica estos 3 puntos: (1) La DataTable DT_Items esta asignada al componente MuInventory, (2) el personaje tiene las alas equipadas en la ranura Wings, (3) el personaje esta dentro del volumen AMuFlightZoneVolume con AllowFlight=true.

๐Ÿชฝ Vuelo, Alas y Zonas Seguras

๐ŸชฝAMuFlightZoneVolume
MULTIJUGADOR
Coloca volumenes en tu nivel. Controla permisos de vuelo y regeneracion de escudo en zonas seguras. Como ciudades vs campos en MU Online.
Configurar en el panel de Detalles
Allow FlightLos personajes con alas pueden volar aquitrue
Is Safe ZoneEl escudo se regenera aqui, sin PvPfalse
Patron MU Online: Coloca un volumen grande cubriendo todo el mapa con AllowFlight=true. Dentro, coloca volumenes pequenos en las ciudades con AllowFlight=false + IsSafeZone=true. Al salir de la ciudad, el vuelo se activa automaticamente.
๐Ÿ•Š๏ธSistema de Levitacion (estilo MU Online)
MULTIJUGADOR
Cuando el personaje tiene alas equipadas y sale de la ciudad, comienza a levitar automaticamente: se eleva y desciende suavemente en un ritmo sinusoidal, ligeramente inclinado hacia adelante, exactamente como en MU Online clasico.
Como funciona
1
El jugador equipa unas alas en la ranura Wings de su inventario.
2
Sale de la ciudad (abandona el volumen de zona segura con AllowFlight=false).
3
El vuelo se activa automaticamente (si bAutoFlyOnZoneEnter esta activado, que lo esta por defecto).
4
El personaje comienza a levitar: el mesh sube y baja suavemente (onda sinusoidal), inclinado hacia adelante. Las piernas quedan en pose de vuelo.
5
Al entrar en una ciudad, el personaje aterriza automaticamente y la levitacion se detiene.
Configurar en el panel de Detalles (AMuCharacter)
Bob AmplitudeAmplitud vertical del balanceo (cm)15.0
Bob FrequencyCiclos por segundo del balanceo1.2
Flight Pitch TiltInclinacion hacia adelante (grados, negativo = adelante)-8.0
Auto Fly On Zone EnterVolar automaticamente al entrar en zona de vuelo con alastrue
Default Wing SocketSocket de respaldo para alas en la espaldaspine_03
Rendimiento: El Tick del personaje solo se activa mientras esta volando. En tierra, el Tick esta deshabilitado: cero coste de CPU.
Socket de alas: Las alas se enganchan automaticamente al socket configurado en el item (AttachSocket). Si el item no tiene socket definido y esta en la ranura Wings, se usa el socket de respaldo spine_03 (centro de la espalda). Crea este socket en tu Skeleton Editor sobre el hueso de la columna.
โš”๏ธAtaque con Parte Superior del Cuerpo en Vuelo
MULTIJUGADOR
Como en MU Online clasico: mientras vuelas, solo la parte superior del cuerpo se mueve al atacar. Las piernas mantienen la pose de vuelo. Esto se logra con un slot de animacion de cuerpo superior (Layered Blend Per Bone).
Como configurar en tu AnimBP
1
Abre tu Animation Blueprint (el AnimBP asignado a la clase en DT_Classes).
2
Agrega un nodo "Slot 'UpperBody'" en el AnimGraph. Este nodo reproducira los montajes de ataque.
3
Conecta un nodo "Layered Blend Per Bone": la capa base es tu locomotion/vuelo. La capa superior es el Slot 'UpperBody'. En la configuracion del blend, establece el hueso de separacion como spine_01 o spine_02.
4
En tus montajes de ataque: asignalos al Slot Group "UpperBody" en el editor de Montage (seccion Slot en la parte superior del timeline).
5
Usa el nodo Blueprint "Play Upper Body Montage" en tu personaje para reproducir ataques. Solo la parte superior del cuerpo animara; las piernas mantienen la pose actual (vuelo o idle).
Configurar en el panel de Detalles (AMuCharacter)
Upper Body Slot NameNombre del slot que debe coincidir con el nodo Slot en tu AnimBPUpperBody
Funcion Blueprint
Play Upper Body Montage(Montage, PlayRate) โ†’ duracion del montaje. Solo la parte superior del cuerpo se mueve.
Importante: El slot "UpperBody" se configura en DOS lugares: (1) en el AnimBP como nodo Slot y (2) en cada montaje de ataque como Slot Group. Si no coinciden, el montaje se reproducira en cuerpo completo en vez de solo la parte superior.

๐Ÿ“ท Camara Tercera Persona

๐Ÿ“ทCamara Estandar de Tercera Persona
MULTIJUGADOR
Camara clasica de tercera persona integrada en AMuCharacter. El Spring Arm sigue la rotacion del controlador (mouse look estandar). El personaje se orienta hacia la direccion de movimiento. No necesitas configurar nada, funciona automaticamente al hacer Play.
Como funciona
1
El mouse controla la camara โ€” mueve el raton para mirar alrededor. El Spring Arm sigue la rotacion del controlador (bUsePawnControlRotation = true).
2
El personaje gira hacia el movimiento โ€” bOrientRotationToMovement esta activado, asi que el personaje rota suavemente hacia la direccion en que caminas (WASD).
3
Colision automatica โ€” la camara nunca atraviesa paredes. El Spring Arm tiene bDoCollisionTest=true, se acerca automaticamente cuando hay un obstaculo.
4
Camera Lag suave โ€” bEnableCameraLag esta activado con velocidad 10, dando un seguimiento cinematografico suave en vez de rigido.
Valores por defecto (AMuCharacter)
Target Arm LengthDistancia de la camara al personaje300 cm
Use Pawn Control RotationEl Spring Arm sigue el mousetrue
Do Collision TestLa camara no atraviesa paredestrue
Enable Camera LagSeguimiento suave de la camaratrue
Camera Lag SpeedVelocidad del seguimiento (mayor = mas rapido)10.0
Orient Rotation To MovementEl personaje gira hacia donde caminatrue
Use Controller Rotation YawEl personaje NO gira con el mouse (solo la camara)false
Cero configuracion: La camara funciona automaticamente. Solo arrastra tu AMuCharacter al nivel y dale Play. El mouse controla la camara, WASD mueve al personaje.
Personalizar: Puedes ajustar TargetArmLength en el Spring Arm del personaje (panel de Detalles) para acercar o alejar la camara. Para un RPG mas cinematografico, prueba 400-500 cm. Para algo mas cercano estilo Souls, prueba 200-250 cm.

๐Ÿด Monturas

๐ŸดAMuMount (IMuMountable)
MULTIJUGADOR
Actor montable de referencia. El jinete se engancha al socket, la velocidad de caminata aumenta. Crea subclases para caballo/fenrir/dragon.
Funciones de interfaz
Mount Rider(Peon) โ†’ true si se monto
Dismount Riderโ†’ true si se desmonto
Get Current Riderโ†’ APawn o nulo

๐Ÿ“… Programador de Eventos

๐Ÿ“…UMuEventScheduler (Subsistema de GameInstance)
SOBREVIVE AL VIAJE
Lee una DataTable de programacion y genera eventos en los horarios correctos (horas fijas UTC o intervalo de repeticion). Tambien controla los limites de entradas diarias por jugador.
Configuracion
Set Schedule Table(DataTable) โ†’ inicia la verificacion por minuto
Trigger Event By Name(RowName) โ†’ inicio manual, devuelve AMuEventBase*
Cancel Event(EventId) โ†’ forzar fin de un evento en ejecucion
Get Active Events / Is Event Running
Eventos
On Event Spawned (Evento) - conectar tu UI global

โš”๏ธ Sistema de Eventos

โš”๏ธAMuEventBase
MULTIJUGADORESTADO REPLICADO
Ciclo de vida de eventos servidor autoritativo: Inactivo > Programado > Registro > Activo > Completando > Finalizado. Objetivos por fases, contribucion con ranking, recompensas por niveles. Crea subclases para Blood Castle, Devil Square, etc.
Funciones principales
Try Join Player(PC) โ†’ valida nivel, ticket, limite diario, maximo de jugadores
Record Kill / Record Damage / Record Objectiveโ†’ seguimiento de contribucion
Complete Current Phaseโ†’ avance manual de fase (para DestroyTarget/PickupItem)
Get Time Remainingโ†’ segundos (sincronizado con clientes!)
Get Rankingโ†’ ordenado por puntos de contribucion
Sobreescribir en tu subclase (BP o C++)
On Registration Startโ†’ generar NPC de registro
On Event Activateโ†’ teletransportar jugadores, generar oleadas
On Phase Advance(NuevoIndiceFase) โ†’ generar siguiente oleada
On Event End(bExito) โ†’ mostrar pantalla de resultados
Eventos (replicados a clientes)
On Event State Changed (EstadoAnterior, NuevoEstado)
On Phase Changed (FaseAnterior, NuevaFase)
On Player Joined / On Player Left
On Event Finished
๐ŸฐAMuEventInstance (Blood Castle / Devil Square / Chaos Castle)
Mini-juego instanciado. Teletransporta jugadores al mapa del evento, genera monstruos por fase, maneja muerte/eliminacion/respawn, teletransporta de vuelta al finalizar.
Configuracion
Death Eliminatestrue = Blood Castle, false = Devil Square (respawn)true
PvP EnabledModo Chaos Castlefalse
Disguise PlayersTodos se ven igual (Chaos Castle)false
Event Spawn Location/RotationDonde aparecen los jugadores en el mapa del evento
๐Ÿ‰AMuWorldInvasion (Invasion Dorada / Mago Blanco)
Invasion en mundo abierto. Los mobs aparecen en el mundo real. Cualquier jugador que dane un mob de invasion se auto-registra. Anuncio al matar al jefe. Termina automaticamente cuando todos los mobs mueren.
Configuracion
Spawn Entries[]ClaseMonstruo + Cantidad + SpawnLocations[] + bEsJefe
Auto Register On Damagetrue
Boss Kill Announcement Format"{0} ha derrotado al {1}!"

๐Ÿ–ฅ๏ธ Widget HUD

๐Ÿ–ฅ๏ธUMuHUDWidget
SOBREESCRIBIR EN BP
Widget HUD base en C++. Crea un Widget Blueprint que herede de MuHUDWidget, y auto-construye un layout estilo MU (barras HP/MP/SD/Stamina, barra de habilidades, oro, barra de exp, panel de objetivo). Sobreescribe cualquier elemento agregando un widget con el mismo nombre en tu BP.
Como personalizar
1
Crea un Widget Blueprint, clase padre = MuHUDWidget.
2
No hagas nada y el layout por defecto aparece automaticamente.
3
Para sobreescribir una pieza: agrega un widget con el nombre exacto "HealthBar" (ProgressBar), "ManaText" (TextBlock), etc. Marca "Is Variable". Tu version reemplaza la predeterminada.
Nombres de widgets sobreescribibles
HealthBar, ManaBar, StaminaBar, ShieldBar, ExpBarProgressBar
HealthText, ManaText, StaminaText, ShieldText, ExpTextTextBlock
CharNameText, LevelText, ClassText, GoldText, StatPointsTextTextBlock
SkillBarContainerHorizontalBox (10 ranuras)
TargetHealthBar, TargetNameText, TargetLevelTextPanel de objetivo
Funciones Blueprint
Bind To Character(AMuCharacter) โ†’ conecta todos los delegados, refresca la pantalla
Set Target(Actor) โ†’ muestra barra HP del objetivo (nulo = ocultar)
Refresh Allโ†’ forzar actualizacion de todas las barras

๐Ÿ’พ Sistema de Guardado

๐Ÿ’พUMuSaveSubsystem (Subsistema de GameInstance)
SOBREVIVE AL VIAJE
Captura stats + inventario + equipo + posicion del personaje en UMuSaveGame. Tambien guarda contenido de actores de almacenamiento. Soporta multiples ranuras de personaje, I/O asincrono, migracion de versiones.
Funciones Blueprint
Save Character(Personaje, CharacterId) โ†’ capturar en memoria
Apply Character(CharacterId, Personaje) โ†’ restaurar desde memoria
Save Storage / Apply Storageโ†’ igual para cofres/bovedas
Save To Slot / Load From Slot(NombreSlot) โ†’ lectura/escritura en disco
Save To Slot Async / Load From Slot Asyncโ†’ sin bloqueo
Does Slot Exist / Delete Slot
Eventos
On Save Completed (bExito)
On Load Completed (bExito)
Las bonificaciones de equipo NO se duplican al cargar. StatsComponent guarda los valores EquipBonusMax directamente. InventoryComponent restaura los items pero NO re-aplica las bonificaciones por item. Esto es por diseno.

๐Ÿ”ง Libreria Blueprint

๐Ÿ”งUMuLibrary (funciones BP estaticas)
Nodos utilitarios para tus Blueprints de interfaz. Soluciones de un solo nodo para tareas comunes.
Funciones
Get Mu Stats / Get Mu Inventory(Actor) โ†’ referencia al componente
Format Class Name(EMuCharacterClass) โ†’ "Dark Knight"
Format Upgrade Level(int) โ†’ " +10" o vacio
Format Number(int64) โ†’ "1,234"
Format Skill Tags(mascara) โ†’ "Magic | AoE"
Rarity Color(EMuItemRarity) โ†’ blanco/azul/verde/morado/naranja/dorado
Is Item Equipment / Is Item Consumableโ†’ bool
Health Percent(Actual, Maximo) โ†’ 0-1
Experience To Next Level(XP, Umbrales, Nivel) โ†’ XP necesaria + porcentaje

๐Ÿ‘ค Estado del Jugador

๐Ÿ‘คAMuPlayerState
REPLICADO
Lleva la clase y nivel del personaje en el PlayerState (visible para todos los clientes). Para marcadores, placas de nombre, UI de grupo.
Eventos
On Class Changed (NuevaClase)
On Level Changed (NuevoNivel)

๐Ÿ“‹ Referencia Rapida: Todos los Eventos

Stats: OnHealthChanged (NuevoValor, ValorMaximo)
Stats: OnManaChanged (NuevoValor, ValorMaximo)
Stats: OnStaminaChanged (NuevoValor, ValorMaximo)
Stats: OnShieldChanged (NuevoValor, ValorMaximo)
Stats: OnLevelChanged (NuevoNivel)
Stats: OnExperienceChanged (NuevaXP)
Stats: OnDied
Stats: OnRevived
Stats: OnDamaged (Cantidad, TipoDano, Causante)
Inventario: OnInventoryChanged
Inventario: OnGoldChanged (NuevoOro)
Inventario: OnEquipmentChanged (Ranura, NuevoItem)
Habilidades: OnSkillCast (SkillId, Resultado)
Habilidades: OnSkillEffect (InfoCast) - TODOS LOS CLIENTES
Generador: OnMonsterSpawned / OnMonsterDied (Monstruo)
Almacen: OnStorageChanged
Guardado: OnSaveCompleted / OnLoadCompleted (bExito)
Programador: OnEventSpawned (Evento)
Evento: OnEventStateChanged (EstadoAnterior, NuevoEstado)
Evento: OnPhaseChanged / OnPlayerJoined / OnPlayerLeft / OnEventFinished
EstadoJugador: OnClassChanged / OnLevelChanged

๐Ÿ”ง Solucion de Problemas

"Todas las clases pueden lanzar todas las habilidades" - El AllowedSkillTags de tu fila de clase es 0 (vacio). Configura la mascara de bits: Melee para caballeros, Magic para magos, etc. Las filas de habilidades tambien necesitan RequiredTags configurados.
"Bonificaciones de equipo duplicadas tras cargar" - Estas llamando ApplyEquipmentBonus manualmente al cargar. No lo hagas. El sistema de guardado lo maneja. Stats guarda los valores de bonus directamente; Inventario restaura items pero no re-aplica.
"El cliente no puede ver el temporizador del evento" - Asegurate de leer GetTimeRemaining del actor del evento. EventState, CurrentPhaseIndex y EventEndTime estan replicados. El temporizador usa tiempo sincronizado del servidor (GetServerWorldTimeSeconds).
"El escudo no se regenera" - El escudo solo se regenera en zonas seguras (AMuFlightZoneVolume con bIsSafeZone=true). Tambien necesita equipo que provea BonusMaxShield (sin MaxShield = sin regeneracion).
"El generador de monstruos no hace nada" - El componente debe estar en un actor con UBoxComponent (raiz o hijo). Colocalo en un TriggerBox. Tambien verifica que MonsterEntries no este vacio.
"El vuelo no funciona" - Tres condiciones: (1) Item de Alas equipado en la ranura Wings, (2) dentro de un AMuFlightZoneVolume con bAllowFlight=true, (3) bAutoFlyOnZoneEnter activado (por defecto) O el jugador llamo a ToggleFlight manualmente. Si sales de una ciudad y no levitas, verifica que la ciudad tiene un volumen con AllowFlight=false y que el area exterior tiene un volumen con AllowFlight=true.
"La levitacion no se ve suave" - Verifica que BobFrequency no sea demasiado alto (1.0-1.5 es ideal). BobAmplitude controla la altura del balanceo (10-20 cm recomendado). FlightPitchTilt controla la inclinacion (-5 a -12 grados es el rango MU clasico).
"El empaquetado falla con tipos indefinidos" - Las compilaciones del editor funcionan pero el empaquetado es mas estricto. Todos los headers deben tener forward declarations explicitas o includes para tipos del motor (UTexture2D, UStaticMesh, etc.). Este plugin incluye todas las declaraciones necesarias.
MU Plugin v0.2.0 | Adrenaline Games | adrenalinegames.pl