Jump to content

how can i change the distance between monster and player?


Eddyyy

Recommended Posts

hello everyone merry christmas. maybe one of you smart ones can help me and give me a tip where in (java/j2r/gameserver/ai) can i change the distance between monster and player?

 

  my problem is, almost all monsters run into the player before they start attacking, so they are practically in the same place as the player.

 

  I would like to have all the monsters stick to the attack range... and don't run into the player. does anyone have any good advice/tips?

 

is it this ,found at code line 1255

 

                final L2Character target = getAttackTarget();
                if (target != null)
                {
                    if (target.isMoving())
                    {
                        range -= 100;
                    }
                    // moveToPawn(target, Math.max(range, 5));
                    moveTo(target.getLocation());
                }
            }
            return;

Edited by Vision
Link to comment
Share on other sites

can you give us more information? All monsters should go to player first before attacking. (attacking will auto path to player if not in range...)

Link to comment
Share on other sites

14 hours ago, HyperBlown said:

can you give us more information? All monsters should go to player first before attacking. (attacking will auto path to player if not in range...)

hello, yes the monsters run to the player and then they attack, that works fine. only they run into the player, so they are far too close to the player. you only see a bunch of monsters standing inside each other in the same place as the player. I would like to change that, that the monsters stop just in front of the player and don't run into him.

Link to comment
Share on other sites

moveTo goes on the exact same spot than X/Y/Z. It uses MoveToLocation packet, which got no specific content about offset. Use moveToPawn to set and handle an offset.

If you can't use moveToPawn (for no reason, but let's say you can't), edit updatePosition in order to handle offset and call a stopMove if you reached the place (if offset > 0 and dist < offset return true). It's definitively not what L2OFF is supposed to do, but it will work.

Without proper offset calculation/handling, everything like bows etc will make you melee.
Link to comment
Share on other sites

3 hours ago, Tryskell said:

moveTo goes on the exact same spot than X/Y/Z. It uses MoveToLocation packet, which got no specific content about offset. Use moveToPawn to set and handle an offset.

If you can't use moveToPawn (for no reason, but let's say you can't), edit updatePosition in order to handle offset and call a stopMove if you reached the place (if offset > 0 and dist < offset return true). It's definitively not what L2OFF is supposed to do, but it will work.

Without proper offset calculation/handling, everything like bows etc will make you melee.

many thanks for your tips. The problem is that I don't know anything about writing code. if you would be so kind and give me an example of how the code you gave me as a tip should look like, i would be extremely grateful.

Link to comment
Share on other sites

Movement is a complex (not the hardest, but still) code, unfortunately giving you an "exemple" would be basically coding it for you. And launching yourself on such thing without experience is bad aswell.

Eventually, read old L2J code, movement is working "ok" - at least it doesn't have your type of issue. Try to mimic what exists, on whatever pack the feature is working on.

You can begin to quote moveTo and unquote moveToPawn and figure if it works better or not.
Link to comment
Share on other sites

7 hours ago, Tryskell said:

Movement is a complex (not the hardest, but still) code, unfortunately giving you an "exemple" would be basically coding it for you. And launching yourself on such thing without experience is bad aswell.

Eventually, read old L2J code, movement is working "ok" - at least it doesn't have your type of issue. Try to mimic what exists, on whatever pack the feature is working on.

You can begin to quote moveTo and unquote moveToPawn and figure if it works better or not.

ok thanks for your help. I am going to try it.

Link to comment
Share on other sites

final L2Character target = getAttackTarget();
                if (target != null)
                {
                    if (target.isMoving())
                    {
                        range -= 100;
                    }
                    // moveToPawn(target, Math.max(range, 5)); -- delete the "//"  

"//" if is if front of a code line , the compiler wont use that line in your code. so you can try with movetopawn and it should work normal.
                    moveTo(target.getLocation());     --- delete this line at all
                } 
            }

 

 

===============================================

final L2Character target = getAttackTarget();
                if (target != null)
                {
                    if (target.isMoving())
                    {
                        range -= 100;
                    }

                    moveTo(target.getLocation());   

if (!this.isInsideRadius(worldPosition.getX(), worldPosition.getY(), (int) (10+ target.getCollisionRadius()), false))
        {

            
            int x = target.getX();
            int y = target.getY();
            
            double dx = worldPosition.getX() - x;
            double dy = worldPosition.getY() - y;
            
            double dist = Math.sqrt(dx * dx + dy * dy);
            
            double sin = dy / dist;
            double cos = dx / dist;
            
            dist -= offset - 5;
            
            x += (int) (dist * cos);
            y += (int) (dist * sin);
            
            moveTo(x, y, worldPosition.getZ());
            
        }

                } 
            }

 

try this maybe is bullshit maybe works , you can check how a raidboss and minions not colide into eachother and addapt or maybe just use movetopawn best but probably someone added "//" bcs he know smth we don't.

Link to comment
Share on other sites

On 12/27/2022 at 4:37 PM, LoVe+ said:

final L2Character target = getAttackTarget();
                if (target != null)
                {
                    if (target.isMoving())
                    {
                        range -= 100;
                    }
                    // moveToPawn(target, Math.max(range, 5)); -- delete the "//"  

"//" if is if front of a code line , the compiler wont use that line in your code. so you can try with movetopawn and it should work normal.
                    moveTo(target.getLocation());     --- delete this line at all
                } 
            }

 

 

===============================================

final L2Character target = getAttackTarget();
                if (target != null)
                {
                    if (target.isMoving())
                    {
                        range -= 100;
                    }

                    moveTo(target.getLocation());   

if (!this.isInsideRadius(worldPosition.getX(), worldPosition.getY(), (int) (10+ target.getCollisionRadius()), false))
        {

            
            int x = target.getX();
            int y = target.getY();
            
            double dx = worldPosition.getX() - x;
            double dy = worldPosition.getY() - y;
            
            double dist = Math.sqrt(dx * dx + dy * dy);
            
            double sin = dy / dist;
            double cos = dx / dist;
            
            dist -= offset - 5;
            
            x += (int) (dist * cos);
            y += (int) (dist * sin);
            
            moveTo(x, y, worldPosition.getZ());
            
        }

                } 
            }

 

try this maybe is bullshit maybe works , you can check how a raidboss and minions not colide into eachother and addapt or maybe just use movetopawn best but probably someone added "//" bcs he know smth we don't.

hi thank you very much for your code example and your time. I just did it with, moveToPawn(target, Math.max(range, 50)); instead of (range, 5)) and it works perfectly.

 

you seem to know your way around the code extremely well....perhaps you can help me with a problem that's really nagging at me. I do a lot of client modding and bring new monsters into the game,...with the UE2003, and with every new monster I noticed that the spine_rotation_animation is missing with a normal hit. do you perhaps know what the error could be,..or is it in the class_uc_file?

Link to comment
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now


×
×
  • Create New...