[Interlude] Eliminar bufos con click del raton

Iniciado por mikado, Ago 11, 2022, 10:00 PM

Tema anterior - Siguiente tema

mikado



Poder eliminar UD, Snipe, Stealth o CoV es excelente, especialmente en Interlude, donde estas habilidades no tienen un encantamiento de penalización. Muchas personas ya están acostumbradas a cancelar Chant of Revenge antes de presionar Mirage o curarse eliminando Celestial Shield.

necesitaremos

    fuentes del servidor
    interface.u fuentes con compilador


Todo lo que necesita está disponible de forma gratuita.


A parte do servidor


El servidor en nuestro caso es ACIS 36x, pero cualquiera de los dos servirá (quizás PTS). Todo lo que se necesita es agregar un comando que elimine el beneficio especificado. Para mantener el ejemplo simple, pasemos por alto

Para eliminar el beneficio, la mayoría de los clientes modernos envían un paquete RequestDispel, por lo que usaremos el término disipar

Primero, agreguemos un método de disipación a L2Character. Al igual que en las versiones más nuevas del juego, no eliminará los efectos que deberían persistir después de la muerte (por ejemplo, penalizaciones), desventajas, bailes y canciones:

// L2Character.java
 
public  final  void dispelSkillEffect ( int skillId, int skillLevel )  {
// Find skill with matching ID and level
final L2Skill skill = SkillTable. getInstance ( ) . getInfo ( skillId, skillLevel ) ;
// Skill wasn't found and can't be dispelled
if  ( skill ==  null )
{
return ;
}
// Penalty-like or debuff skill effect can't be dispelled
if  ( skill.isStayAfterDeath ( )  || skill. isDebuff ( ) )
{
return ;
}
// Dance-like skill effect can't be dispelled
if  ( skill. isDance ( ) )
{
return ;
}
// Stop skill effect by ID
_effects. stopSkillEffects ( skill. getId ( ) ) ;
}
 
Code: Java

Ahora agreguemos el control de omisión a runImpl del paquete de red RequestBypassToServer proveniente del cliente. Como el método dispelSkillEffect requiere una ID de habilidad y un nivel de habilidad como argumentos, el cliente debe pasarlos como parámetros al comando de disipación:

// RequestBypassToServer.java
 
// Usage: _dispel:<int:skill_id>,<int:skill_level>
// Example: _dispel:313,8
else  if  ( _command. startsWith ( "_dispel" ) )
{
// Cut out command params
String params = _command. substring ( _command. indexOf ( ":" )  +  1 ) ;
// Split params into tokens
StringTokenizer st =  new  StringTokenizer ( params, "," ) ;
// Get skill ID from first token
intid =  Integer . parseInt ( st.nextToken ( ) ) ; _ // Get skill level from second token int level = Integer . parseInt ( st.nextToken ( ) ) ; _ // Dispel skill effect on current character
activeChar. dispelSkillEffect ( id, level ) ; }




 
Code: Java

Ejemplo de llamada: _dispel:313.8 I


Recomiendo hacer un comando con parámetros similares en lugar de ignorar. Además, los jugadores podrán escribir macros para eliminar el beneficio.


Lado do cliente


Desafortunadamente, no hay una manera fácil de rastrear Alt+Clic en el cliente Interlude, por lo que usamos el botón izquierdo del mouse para hacer doble clic para eliminar el beneficio. El evento será manejado por la ventana AbnormalStatusWnd, que muestra los íconos de ventajas y desventajas.

Algoritmo:


    Oímos en la ventana AbnormalStatusWnd un evento de doble clic (OnLButtonDblClick)
    Determinar el beneficio en el que se hizo clic (a través de StatusIcon.GetItem)
    Determinar el ID y el nivel de habilidad de este beneficio (a través de GetSkillInfo)
    Enviamos una solicitud al servidor (a través de RequestBypassToServer o ExecuteCommand )
    Llamamos a dispelSkillEffect en el servidor con el ID recibido y el nivel de habilidad


El evento de doble clic del botón izquierdo del mouse OnLButtonDblClick solo toma las coordenadas del clic como argumentos. Al mismo tiempo, StatusIcon.GetItem requiere especificar la fila y la columna de la celda. Por lo tanto, es necesario determinar en qué fila y en qué columna de nuestros beneficios hizo clic el jugador


Como sabemos que el tamaño de la celda de mejora es de 24 píxeles y el tamaño del controlador al que se arrastra la ventana es de 12 píxeles, es fácil calcular la fila y la celda: simplemente determine las coordenadas de la ventana con mejoras, reste todos los valores y dividir el resto por el tamaño de celda. Los valores se redondearán correctamente cuando se conviertan a int Primero agreguemos NSTATUSICON_SIZE


constante , que describe el tamaño de la celda de beneficio, en la parte superior de la secuencia de comandos. El resto de las constantes del desarrollador ya son:

// AbnormalStatusWnd.uc
 
class AbnormalStatusWnd extends UIScript ;
 
const NSTATUSICON_FRAMESIZE =  12 ;
const NSTATUSICON_MAXCOL =  12 ;
const NSTATUSICON_SIZE =  24 ;
 
// ...

Ahora, en cualquier lugar (por ejemplo, inmediatamente después de la función OnEvent) agregue el manejo de eventos de doble clic:

// AbnormalStatusWnd.uc
 
function OnLButtonDblClick ( int X ,  int Y )  {
local Rect windowBounds ;
local int targetRow ;
local int targetCol ;
 
local StatusIconInfo info ;
local SkillInfo skillInfo ;
 
// Find window position
windowBounds = Me. GetRect ( ) ;
 
// Process clicks outside of window frame only
if  ( X >  ( windowBounds. nX +  NSTATUSICON_FRAMESIZE ) ) {  //
Calc row and col of targeted icon
targetRow =  ( Y - windowBounds. nY )  / NSTATUSICON_SIZE ;
targetCol =  ( X - windowBounds. nX  - NSTATUSICON_FRAMESIZE )  / NSTATUSICON_SIZE ;
 
// Store status info of targeted icon
StatusIcon. GetItem ( targetRow , targetCol , info ) ;
 
// Store actual skill info and make sure it is exists
if  ( GetSkillInfo ( info. ClassID , info. Level , skillInfo ) )  {
// Request server to stop skill effect
// Usage: _dispel:<int:skill_id>,<int :skill_level>
// Example: _dispel:313,8
RequestBypassToServer ( "_dispel:" $ string ( skillInfo. SkillID ) $ "," $ string ( skillInfo. SkillLevel ) ) ) ;
}
}
}

Compile interface.u, cópielo en el cliente, ejecute el juego

¡Hecho!


Gracias a Freelu.