[Release] PvP state quick fix solution (Stiff/Stun/Knockdown/Bound)

Results 1 to 8 of 8
  1. #1
    Account Upgraded | Title Enabled! Aznkidd235 is offline
    MemberRank
    Apr 2007 Join Date
    518Posts

    [Release] PvP state quick fix solution (Stiff/Stun/Knockdown/Bound)

    If you guys have played BDO then you would have seen in these files that a stiff, knockdown, bound and etc does not work the way it should it feels like 0.1 second and instead should be 1-2+ seconds of state change.

    the last few days i have been studying these files and located where the restrictions are applied, but did not find where the timer for these are applied so instead i wrote my own and currently this fix does work and does apply these restrictions as it should.

    i should let you know that Java is not my main coding language and this is just a quick solution
    this code is still incomplete due to me not being able to test with a 2nd player but it does apply state effects longer.

    stun is implemented in this code which the current files does not have stun.

    com\bdoemu\gameserver\model\creature\player\controllers\ActionRestrictionController.java
    Code:
    package com.bdoemu.gameserver.model.creature.player.controllers;
    
    import com.bdoemu.gameserver.model.creature.Creature;
    import com.bdoemu.gameserver.model.creature.player.Player;
    import com.bdoemu.gameserver.model.creature.player.cooltimes.ActionRestrictionEntry;
    
    import java.util.Calendar;
    import java.util.List;
    import java.util.concurrent.ConcurrentHashMap;
    
    public class ActionRestrictionController {
        private Player _player;
        private ConcurrentHashMap<Integer, ActionRestrictionEntry> _actionRestrictions;
        private long _end;
        private int hitType;
        private int player_state;
        
        public ActionRestrictionController(Player player) {
            _actionRestrictions = new ConcurrentHashMap<>();
            _player = player;
            _end = 0L;
            player_state = 0;
        }
    
        public Player getPlayer() {
            return _player;
        }
    
        public boolean isActionRestricted(int actionType) {
            ActionRestrictionEntry entry = _actionRestrictions.get(actionType);
            //_player.getAi().HandleRigid(_player, null);
            return !(entry == null || entry.isExpired());
        }
    
        public boolean checkRestrictCondition(List<Integer> actionTypes) {
            
            for (Integer actionType : actionTypes) {
                ActionRestrictionEntry entry = _actionRestrictions.get(actionType);
                //_player.getAi().HandleRigid(_player, null);
    
                //while(System.currentTimeMillis() < _end) {
                  // do something
                  // pause to avoid churning
                  //Thread.sleep( xxx );
                    //_player.getAi().HandleRigid(_player, null);
                //}
                if (isActionRestricted(actionType))
                    //if(entry.isExpired()){
                    return false;
                    //}
            }
    
            return true;
        }
    
        public void restrictActions(Creature attacker, List<Integer> actionTypes, int mainActionType, int expireTime) {
            //System.out.println("1) Restriction " + (expireTime) + " ms.");
            for (Integer actionType : actionTypes)
                
                restrictAction(attacker, actionType, expireTime, mainActionType == actionType ? 500 : 0);
            
        }
    
        public void restrictAction(Creature attacker, int actionType, int expireTime, int offset) {
            Calendar calendar = Calendar.getInstance();
            //expireTime = (expireTime * 100);
            //calendar.add(Calendar.MILLISECOND, (expireTime + (offset + 100000)));
            calendar.add(Calendar.MILLISECOND, expireTime);
            
            System.out.println("2) Restrict Type=" + actionType + ", Expire=" + expireTime + " ms.");
    
            ActionRestrictionEntry entry = _actionRestrictions.get(actionType);
            
             _actionRestrictions.put(actionType, new ActionRestrictionEntry(actionType, calendar.getTimeInMillis()));
            
            
            //Stiff > Stun > Bound/Knockdown/Float
            //Stun > Stiff > Bound/Knockdown/Float
            //player_state: 1 = rigid, 2 = stun, 3 = bound, 4 = knockdown
            //
            //
            //if(_end<=){
            //} else {
            hitType = actionType;
            System.out.println("HitType: " + hitType + ", player_state: " + player_state + ", timer: " + _end);
            
            if(actionType == 1){
                //rigid
                if(player_state==0){
                    _end = System.currentTimeMillis() + 1300L;
                    player_state = 1;
                } else if(player_state==2){
                    _end = System.currentTimeMillis() + 1300L;
                    player_state = 1;
                }
            } else if(actionType == 2){
                //knockdown
                if(player_state==0){
                    _end = System.currentTimeMillis() + 500L;
                    player_state = 4;
                } else if(player_state==1){
                    _end = System.currentTimeMillis() + 500L;
                    player_state = 4;
                } else if(player_state==2){
                    _end = System.currentTimeMillis() + 500L;
                    player_state = 4;
                }
                
                } else if(actionType == 3){
                    //rigid
                        if(player_state==0){
                            _end = System.currentTimeMillis() + 1300L;
                            player_state = 1;
                            } else if(player_state==2){
                                _end = System.currentTimeMillis() + 1300L;
                                player_state = 1;
                            }
                } else if(actionType == 4){
                    //stun
                    if(player_state==0){
                            _end = System.currentTimeMillis() + 1300L;
                            player_state = 2;
                            } else if(player_state==1){
                                _end = System.currentTimeMillis() + 1300L;
                                player_state = 2;
                            }
                } else if(actionType == 6){
                    //rigid
                    if(player_state==0){
                        _end = System.currentTimeMillis() + 1300L;
                        player_state = 1;
                            } else if(player_state==2){
                                _end = System.currentTimeMillis() + 1300L;
                                player_state = 1;
                            }
                } else if(actionType == 7){
                    //bound
                    if(player_state==0){
                        _end = System.currentTimeMillis() + 800L;
                        player_state = 3;
                    } else if(player_state==1){
                        _end = System.currentTimeMillis() + 800L;
                        player_state = 3;
                    } else if(player_state==2){
                        _end = System.currentTimeMillis() + 800L;
                        player_state = 3;
                    }
                    }else if(actionType == 12){
                        //knockdown
                        if(player_state==0){
                            _end = System.currentTimeMillis() + 500L;
                            player_state = 4;
                        } else if(player_state==1){
                            _end = System.currentTimeMillis() + 500L;
                            player_state = 4;
                        } else if(player_state==2){
                            _end = System.currentTimeMillis() + 500L;
                            player_state = 4;
                        }
                }else {
                    //_end = System.currentTimeMillis() + 5000L;
                }
            //}
            System.out.println("HitType: " + hitType + ", player_state: " + player_state + ", timer: " + _end);
            
            //if (entry == null) {
            //calendar.add(Calendar.MILLISECOND, (expireTime + (offset + 100000)));
    
                //_actionRestrictions.put(actionType, new ActionRestrictionEntry(actionType, calendar.getTimeInMillis()));
                //_actionRestrictions.put(actionType, new ActionRestrictionEntry(actionType, 5000));
            //} else {
                //entry.setExpirationTime(calendar.getTimeInMillis());
                if(_end > System.currentTimeMillis()){
            new Thread(new Runnable() {
    
                @Override
                public void run() {
                    //for(int i=0; i<100; i++) {
                    while(System.currentTimeMillis() < _end) {
                        System.out.println("HitType: " + hitType + ", player_state: " + player_state);
                        if(hitType==1){
                        _player.getAi().HandleRigid(_player, null);
                        } else if(hitType==2) {
                            _player.getAi().HandleKnockDown(_player, null);
                        } else if(hitType==3) {
                            _player.getAi().HandleRigid(_player, null);
                        } else if(hitType==4) {
                            _player.getAi().HandleRigid(_player, null);
                        } else if(hitType==6) {
                            _player.getAi().HandleRigid(_player, null);
                        } else if(hitType==7) {
                            _player.getAi().HandleBound(_player, null);
                        } else if(hitType==12) {
                            _player.getAi().HandleKnockDown(_player, null);
                        } else {
                            //_player.getAi().HandleRigid(_player, null);
                        }
                        if(System.currentTimeMillis() >= _end) {
                            if(player_state>0){
                            player_state = 0;
                            }
                            _end = 0L;
                            //Thread.interrupted();
                        }
                        }
                    }
                
            }).start();
    
        }
            //}
        }
        
    }
    I hope others would release their works for fixing and improving the server files.

    you must compile this .java to .class and import through Eclipse and export as .jar

    if a skill does not apply a state change the print console is there just get the actionType "hitType" ID and update this source with the ID.

    if you guys want to know where the HandleRigid, HandleKnockdown state changes are applied it's located at:
    gameserver/scripts/ai/Ai_pc.java

    Grab code is handled at:
    com\bdoemu\gameserver\model\actions\actioncharts\CatchAction.java

    i can confirm this is the file that handles grabs as i'm currently trying to fix grabs don't expect too much, but i will release a fix or a temp fix when i can.
    Last edited by Aznkidd235; 05-01-18 at 10:29 PM.


  2. #2
    Enthusiast Telurian is offline
    MemberRank
    Apr 2012 Join Date
    38Posts

    Re: [Release] PvP state quick fix solution (Stiff/Stun/Knockdown/Bound)

    Wow, nice thanks :)

  3. #3
    Logged in to "The World" TriEdge is online now
    MemberRank
    Sep 2010 Join Date
    465Posts

    Re: [Release] PvP state quick fix solution (Stiff/Stun/Knockdown/Bound)

    nice work fixing this.

    Also please delete your inbox. It is full :D

  4. #4
    Enthusiast rewera is offline
    MemberRank
    May 2009 Join Date
    48Posts

    Re: [Release] PvP state quick fix solution (Stiff/Stun/Knockdown/Bound)

    how to avoid loading cpu when using it?

  5. #5
    Account Upgraded | Title Enabled! Aznkidd235 is offline
    MemberRank
    Apr 2007 Join Date
    518Posts

    Re: [Release] PvP state quick fix solution (Stiff/Stun/Knockdown/Bound)

    what do you mean?

  6. #6
    Enthusiast rewera is offline
    MemberRank
    May 2009 Join Date
    48Posts

    Re: [Release] PvP state quick fix solution (Stiff/Stun/Knockdown/Bound)

    whenever a character uses to continue, or opushennye the server starts to load the processor! if we have 100 people and at the same time this happens, there will be trouble :d

  7. #7
    Account Upgraded | Title Enabled! Aznkidd235 is offline
    MemberRank
    Apr 2007 Join Date
    518Posts

    Re: [Release] PvP state quick fix solution (Stiff/Stun/Knockdown/Bound)

    you mean the code? or what? i don't really understand what your trying to say.

  8. #8
    Enthusiast rewera is offline
    MemberRank
    May 2009 Join Date
    48Posts

    Re: [Release] PvP state quick fix solution (Stiff/Stun/Knockdown/Bound)

    Yes, the code loads the processor \ sorry my english is bad

    Diminishing is needed for stun
    Last edited by rewera; 07-01-18 at 06:40 AM.



Advertisement