Advertisement
Guest User

Untitled

a guest
Aug 23rd, 2017
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 17.98 KB | None | 0 0
  1. package com.arrow.server.game.world.entity.player;
  2.  
  3. import java.io.Serializable;
  4. import java.util.concurrent.ConcurrentLinkedQueue;
  5.  
  6. import com.arrow.GameConstants;
  7. import com.arrow.server.cache.definitions.ItemDefinitions;
  8. import com.arrow.server.game.content.action.ActionQueue;
  9. import com.arrow.server.game.content.dialogue.DialogueInterpreter;
  10. import com.arrow.server.game.content.eoc.CombatStyle;
  11. import com.arrow.server.game.content.eoc.ability.AbilityBook;
  12. import com.arrow.server.game.content.eoc.actionbar.ActionBar;
  13. import com.arrow.server.game.content.exchange.GrandExchange;
  14. import com.arrow.server.game.world.entity.Entity;
  15. import com.arrow.server.game.world.entity.item.Item;
  16. import com.arrow.server.game.world.entity.item.inventory.Inventory;
  17. import com.arrow.server.game.world.entity.item.inventory.equipment.EquipSlot;
  18. import com.arrow.server.game.world.entity.item.inventory.equipment.Equipment;
  19. import com.arrow.server.game.world.entity.item.inventory.pouch.MoneyPouch;
  20. import com.arrow.server.game.world.entity.player.manager.CS2ScriptManager;
  21. import com.arrow.server.game.world.entity.player.manager.EmotesManager;
  22. import com.arrow.server.game.world.entity.player.manager.InterfaceManager;
  23. import com.arrow.server.game.world.entity.player.manager.PerformanceManager;
  24. import com.arrow.server.game.world.entity.player.manager.PropertiesManager;
  25. import com.arrow.server.game.world.entity.player.skills.Skill;
  26. import com.arrow.server.game.world.entity.player.skills.Skills;
  27. import com.arrow.server.game.world.entity.render.NPCRendering;
  28. import com.arrow.server.game.world.entity.render.PlayerRendering;
  29. import com.arrow.server.game.world.entity.render.block.movement.route.RouteEvent;
  30. import com.arrow.server.game.world.region.location.Location;
  31. import com.arrow.server.network.packet.PacketRepository;
  32. import com.arrow.server.network.packet.PacketWriter;
  33. import com.arrow.server.network.packet.event.PacketEventContext;
  34. import com.arrow.server.network.protocol.login.LoginReadEvent.LoginRequest;
  35. import com.arrow.server.network.session.Session;
  36. import com.arrow.server.network.session.impl.GameSession;
  37.  
  38. public class Player extends Entity implements Serializable {
  39.  
  40.     /* Represents Serial UID */
  41.     private static final long serialVersionUID = -4881853363279394569L;
  42.  
  43.     /**
  44.      * Player Information
  45.      */
  46.    
  47.     /* Current Route Event */
  48.     private transient RouteEvent routeEvent;
  49.    
  50.     /* Current Queued Actions */
  51.     private transient ActionQueue actionQueue;
  52.    
  53.     /* Player's Session */
  54.     private transient GameSession session;
  55.    
  56.     /* Player Rendering */
  57.     private transient PlayerRendering playerRendering;
  58.    
  59.     /* NPC Rendering */
  60.     private transient NPCRendering npcRendering;
  61.    
  62.     /* Player's Information */
  63.     private PlayerInformation playerInformation;
  64.    
  65.     /**
  66.      * Networking Attributes
  67.      */
  68.    
  69.     /* Decoder Timeout */
  70.     private transient long decoderTimeout;
  71.    
  72.     /* Packet Writer */
  73.     private PacketWriter packetWriter;
  74.    
  75.     /**
  76.      * Player's Containers
  77.      */
  78.    
  79.     /* Player's Skills */
  80.     private Skills skills;
  81.    
  82.     /* Player's Equipment */
  83.     private Equipment equipment;
  84.    
  85.     /* Player's Inventory */
  86.     private Inventory inventory;
  87.    
  88.     /* Player's Money Pouch */
  89.     private MoneyPouch moneyPouch;
  90.    
  91.     /* Players Grand Exchange Data */
  92.     private GrandExchange grandExchange;
  93.    
  94.     /* Player's Action Bar State */
  95.     private ActionBar actionBar;
  96.    
  97.     /* Player's Ability Book Data */
  98.     private AbilityBook abilityBook;
  99.    
  100.     /**
  101.      * Player's Managers
  102.      */
  103.    
  104.     /* Performance Manager */
  105.     private transient PerformanceManager performanceManager;
  106.    
  107.     /* Interface Manager */
  108.     private transient InterfaceManager interfaceManager;
  109.    
  110.     /* Dialogue Interpreter */
  111.     private transient DialogueInterpreter dialogueInterpreter;
  112.    
  113.     /* CS2 Script Manager */
  114.     private transient CS2ScriptManager cs2ScriptManager;
  115.    
  116.     /* Emotes Manager */
  117.     private EmotesManager emotesManager;
  118.    
  119.     /* Properties Manager */
  120.     private PropertiesManager propertiesManager;
  121.  
  122.     /**
  123.      * Constructor used to create Player
  124.      * @param playerInformation
  125.      */
  126.     public Player(PlayerInformation playerInformation) {
  127.         /**
  128.          * Player Networking
  129.          */
  130.         setPlayerRendering(new PlayerRendering(this));
  131.         setNpcRendering(new NPCRendering(this));
  132.         setPacketSender(new PacketWriter(this));
  133.         /**
  134.          * Player Information
  135.          */
  136.         setPlayerInformation(playerInformation);
  137.         setSkills(new Skills(this));
  138.         /**
  139.          * Player Containers
  140.          */
  141.         setEquipment(new Equipment(this));
  142.         setInventory(new Inventory(this));
  143.         setMoneyPouch(new MoneyPouch(this));
  144.         setGrandExchange(new GrandExchange(this));
  145.  
  146.         /**
  147.          * Action Bars
  148.          */
  149.         setActionBar(new ActionBar(this));
  150.         setAbilityBook(new AbilityBook(this));
  151.  
  152.         /**
  153.          * Managers
  154.          */
  155.         setPerformanceManager(new PerformanceManager(this));
  156.         setInterfaceManager(new InterfaceManager(this));
  157.         setDialogueInterpreter(new DialogueInterpreter(this));
  158.         setEmotesManager(new EmotesManager(this));
  159.         setCs2ScriptManager(new CS2ScriptManager(this));
  160.         setPropertiesManager(new PropertiesManager(this));
  161.     }
  162.  
  163.    
  164.     /**
  165.      * Processes Login
  166.      * @param session
  167.      * @param request
  168.      */
  169.     public void sendLogin(Session session, LoginRequest request) {
  170.         this.session = (GameSession) session;
  171.         switch (request) {
  172.         case REQUEST_LOBBY:
  173.             getPacketManager().sendConfig(1749, 3977);
  174.             getPacketManager().sendConfig(1754, 20);
  175.             getPacketManager().sendConfig(2863, 117440512);
  176.             getPacketManager().sendConfig(2897, -805091453);
  177.             getPacketManager().sendConfig(3184, 1);
  178.             break;
  179.         case REQUEST_WORLD:
  180.             init();
  181.             refreshRegion(true);
  182.             GameConstants.getWorld().getRegionManager().refreshRegionForEntity(this);
  183.             GameConstants.getWorld().getRegionManager().refreshSpawnedObjects(this);
  184.             getPacketManager().sendConfig(1295, 1000);// TUTORIAL
  185.             getInventory().refreshInventory();
  186.             getEquipment().refreshEquipment();
  187.             getSkills().initialize();
  188.             getEmotesManager().refreshEmotes();
  189.             getActionBar().refresh();
  190.             getAbilityBook().refreshBook();
  191.             getMoneyPouch().refreshMoneyPouch();
  192.             getPropertiesManager().refreshRunEnergy();
  193.             getCombatProperties().setMaxHealth(((getSkills().getLevel(Skill.CONSTITUTION) * 40) * 2)
  194.                     + getCombatProperties().getBonuses().getLifepoints());
  195.             getCombatProperties().refreshHealth();
  196.             getPacketManager().sendConfig(3274, (getSkills().getLevel(Skill.PRAYER) * 100));
  197.             getPacketManager().sendPlayerOption(1, "Follow");
  198.             getPacketManager().sendPlayerOption(2, "Trade");
  199.             getPacketManager().sendPlayerOption(3, "Req Assist");
  200.             getPacketManager().sendPlayerOption(4, "Challange");
  201.             getPacketManager().sendPlayerOption(5, "Examine");
  202.             getPacketManager().sendOnlineStatus();
  203.             getPacketManager().sendUnlockFriendsList();
  204.             getInterfaceManager().sendInterfaces();
  205.             getRenderProcessor().getAppearance().renderBlock(null);
  206.             setNextLocation(new Location(3222, 3222, 0));
  207.             getPacketManager().sendGlobalConfig(823, 1);// EXTRAS CONFIG
  208.             getPacketManager().sendCS2Script(1211, new Object[] { "Welcome to " + GameConstants.SERVER_NAME + ".", 0, -120, 0 });
  209.             getPacketManager().sendGameMessage("Welcome to " + GameConstants.SERVER_NAME + ".");
  210.             break;
  211.         default:
  212.             break;
  213.         }
  214.     }
  215.    
  216.  
  217.     /**
  218.      * Process Logout
  219.      * @param toLobby
  220.      */
  221.     public void sendLogout(boolean toLobby) {
  222.        
  223.         if (GameConstants.getWorld().containsPlayer(getPlayerInformation().getUsername()))
  224.             GameConstants.getWorld().removePlayer(this);
  225.        
  226.         if (getActionQueue() != null)
  227.             getActionQueue().emptyRepository();
  228.        
  229.         if (getCombatSchedule().isCombatStance() && getCombatSchedule().isCombatting()) {
  230.             getCombatSchedule().getVictim().getCombatSchedule().setLock(null);
  231.             getCombatSchedule().getVictim().getCombatSchedule().end();
  232.             getCombatSchedule().setCombatting(false);
  233.         }
  234.        
  235.         setFinished(true);
  236.         GameConstants.getWorld().getRegionManager().refreshRegionForEntity(this);
  237.     }
  238.    
  239.     /**
  240.      * Encode packet for player.
  241.      * @param clazz
  242.      * @param event
  243.      */
  244.     public void writePacket(Class<?> clazz, PacketEventContext event) {
  245.         getSession().write(clazz, PacketRepository.writePacket(event));
  246.     }
  247.    
  248.     /**
  249.      * Force load region.
  250.      */
  251.     public void refreshRegion(boolean login) {
  252.         super.refreshRegion(login);
  253.         getPacketManager().sendRegion(login);
  254.     }
  255.    
  256.     /**
  257.      * Checks if Player is online.
  258.      * @return online
  259.      */
  260.     public boolean isOnline() {
  261.         if (GameConstants.getWorld().containsPlayer(getPlayerInformation().getUsername()))
  262.             return true;
  263.         return false;
  264.     }
  265.  
  266.     /**
  267.      * Quick Reset.
  268.      */
  269.     public void reset() {
  270.         reset(true);
  271.     }
  272.    
  273.     /**
  274.      * Resets all players attributes.
  275.      * @param stopWalk
  276.      */
  277.     public void reset(boolean stopWalk) {
  278.         if (stopWalk)
  279.             getMovement().resetWalkSteps();
  280.        
  281.         setRouteEvent(null);
  282.         getCombatSchedule().end();
  283.         getActionQueue().dequeAction();
  284.         resetFaceEntity();
  285.     }
  286.  
  287.     /*
  288.      * (non-Javadoc)
  289.      * @see com.arrow.game.node.entity.Entity#init()
  290.      */
  291.     @Override
  292.     public void init() {
  293.         setSize(1);
  294.         getMovement().setWalkSteps(new ConcurrentLinkedQueue<Object[]>());
  295.         setActionQueue(new ActionQueue());
  296.         setLastFaceEntity(-1);
  297.         setFaceEntity(-2);
  298.         getMovement().setNextWalkDirection(-1);
  299.         getMovement().setNextRunDirection(-1);
  300.         super.init();
  301.     }
  302.  
  303.     /*
  304.      * (non-Javadoc)
  305.      * @see com.arrow.game.node.entity.Entity#startCycle()
  306.      */
  307.     @Override
  308.     public void startCycle() {
  309.         if (getRouteEvent() != null && getRouteEvent().processEvent(this))
  310.             setRouteEvent(null);
  311.        
  312.         getMovement().processMovement();
  313.         getActionQueue().cycleAction();
  314.         super.startCycle();
  315.     }
  316.  
  317.     /*
  318.      * (non-Javadoc)
  319.      * @see com.arrow.game.node.entity.Entity#resetCycle()
  320.      */
  321.     @Override
  322.     public void resetCycle() {
  323.         if (getMovement().getNextWalkDirection() == -1)
  324.             getMovement().setNextFaceLocation(null);
  325.        
  326.         setFaceEntity(-2);
  327.         getPlayerRendering().reset();
  328.         if (needRegionUpdate())
  329.             GameConstants.getWorld().getRegionManager().refreshSpawnedObjects(this);
  330.         super.resetCycle();
  331.     }
  332.  
  333.     /*
  334.      * (non-Javadoc)
  335.      * @see com.arrow.game.node.entity.Entity#needMasksUpdate()
  336.      */
  337.     @Override
  338.     public boolean needMasksUpdate() {
  339.         return super.needMasksUpdate() || getFaceEntity() != -2
  340.                 || (getMovement().getNextWalkDirection() == -1 && getMovement().getNextFaceLocation() != null);
  341.     }
  342.  
  343.     /*
  344.      * (non-Javadoc)
  345.      * @see com.arrow.game.node.entity.Entity#getCombatStyle(boolean)
  346.      */
  347.     @Override
  348.     public CombatStyle getCombatStyle(boolean offhand) {
  349.         Item weapon = getEquipment().get(offhand ? EquipSlot.MAIN_HAND : EquipSlot.OFF_HAND);
  350.         if (weapon != null) {
  351.             CombatStyle style = weapon.getDefinitions().getCombatStyle();
  352.             if (style != null) {
  353.                 return style;
  354.             }
  355.         }
  356.         return offhand ? null : CombatStyle.MELEE;
  357.     }
  358.  
  359.     /*
  360.      * (non-Javadoc)
  361.      * @see com.arrow.game.node.entity.Entity#getCombatAnimation(int)
  362.      */
  363.     @Override
  364.     public int getCombatAnimation(int index) {
  365.         int slot = index == 0 ? EquipSlot.MAIN_HAND.ordinal() : EquipSlot.OFF_HAND.ordinal();
  366.         int animId = -1;
  367.         Item item;
  368.         if (index < 2) {
  369.             if ((item = getEquipment().get(slot)) == null) {
  370.                 animId = 18226;
  371.             } else {
  372.                 animId = item.getDefinitions().getMainhandEmote();
  373.                 if (index == 1) {
  374.                     animId = item.getDefinitions().getOffhandEmote();
  375.                 }
  376.             }
  377.         }
  378.         return animId;
  379.     }
  380.  
  381.     /*
  382.      * (non-Javadoc)
  383.      * @see com.arrow.game.node.entity.Entity#getRenderEmote()
  384.      */
  385.     @Override
  386.     public int getRenderEmote() {
  387.         int renderId = getRenderProcessor().getAppearance().getCustomRenderAnimation() == -1 ? 2699
  388.                 : getRenderProcessor().getAppearance().getCustomRenderAnimation();
  389.         Item item = getEquipment().get(EquipSlot.MAIN_HAND);
  390.         if (getCombatSchedule().isCombatStance()) {
  391.             if (item == null) {
  392.                 renderId = 2687;
  393.             } else {
  394.                 ItemDefinitions def = getEquipment().get(EquipSlot.MAIN_HAND).getDefinitions();
  395.                 renderId = def.getAggressiveAnimation();
  396.             }
  397.         } else {
  398.             if (item == null || getActionBar().isSheathing()) {
  399.                 renderId = getRenderProcessor().getAppearance().getCustomRenderAnimation() == -1 ? 2699
  400.                         : getRenderProcessor().getAppearance().getCustomRenderAnimation();
  401.             } else {
  402.                 ItemDefinitions def = getEquipment().get(EquipSlot.MAIN_HAND).getDefinitions();
  403.                 renderId = def.getPassiveAnimation();
  404.             }
  405.         }
  406.         return renderId;
  407.     }
  408.  
  409.     /*
  410.      * (non-Javadoc)
  411.      * @see com.arrow.game.node.entity.Entity#processDeath()
  412.      */
  413.     @Override
  414.     public void processDeath() {
  415.         // TODO Auto-generated method stub
  416.  
  417.     }
  418.  
  419.    
  420.     /**
  421.      *
  422.      * @return the session
  423.      */
  424.     public GameSession getSession() {
  425.         return session;
  426.     }
  427.  
  428.    
  429.     /**
  430.      * @return the routeEvent
  431.      */
  432.     public RouteEvent getRouteEvent() {
  433.         return routeEvent;
  434.     }
  435.  
  436.     /**
  437.      * @param routeEvent the routeEvent to set
  438.      */
  439.     public void setRouteEvent(RouteEvent routeEvent) {
  440.         this.routeEvent = routeEvent;
  441.     }
  442.  
  443.     /**
  444.      * @return the actionQueue
  445.      */
  446.     public ActionQueue getActionQueue() {
  447.         return actionQueue;
  448.     }
  449.  
  450.     /**
  451.      * @param actionQueue the actionQueue to set
  452.      */
  453.     public void setActionQueue(ActionQueue actionQueue) {
  454.         this.actionQueue = actionQueue;
  455.     }
  456.  
  457.     /**
  458.      * @return the playerRendering
  459.      */
  460.     public PlayerRendering getPlayerRendering() {
  461.         return playerRendering;
  462.     }
  463.  
  464.     /**
  465.      * @param playerRendering the playerRendering to set
  466.      */
  467.     public void setPlayerRendering(PlayerRendering playerRendering) {
  468.         this.playerRendering = playerRendering;
  469.     }
  470.  
  471.     /**
  472.      * @return the npcRendering
  473.      */
  474.     public NPCRendering getNpcRendering() {
  475.         return npcRendering;
  476.     }
  477.  
  478.     /**
  479.      * @param npcRendering the npcRendering to set
  480.      */
  481.     public void setNpcRendering(NPCRendering npcRendering) {
  482.         this.npcRendering = npcRendering;
  483.     }
  484.  
  485.     /**
  486.      * @return the playerInformation
  487.      */
  488.     public PlayerInformation getPlayerInformation() {
  489.         return playerInformation;
  490.     }
  491.  
  492.     /**
  493.      * @param playerInformation the playerInformation to set
  494.      */
  495.     public void setPlayerInformation(PlayerInformation playerInformation) {
  496.         this.playerInformation = playerInformation;
  497.     }
  498.  
  499.     /**
  500.      * @return the packetSender
  501.      */
  502.     public PacketWriter getPacketManager() {
  503.         return packetWriter;
  504.     }
  505.  
  506.     /**
  507.      * @param packetSender the packetSender to set
  508.      */
  509.     public void setPacketSender(PacketWriter packetSender) {
  510.         this.packetWriter = packetSender;
  511.     }
  512.    
  513.     /**
  514.      *
  515.      * @return decoderTimeout
  516.      */
  517.     public long getDecoderTimeout() {
  518.         return decoderTimeout;
  519.     }
  520.    
  521.     /**
  522.      * @return the skills
  523.      */
  524.     public Skills getSkills() {
  525.         return skills;
  526.     }
  527.  
  528.     /**
  529.      * @param skills the skills to set
  530.      */
  531.     public void setSkills(Skills skills) {
  532.         this.skills = skills;
  533.     }
  534.  
  535.     /**
  536.      * @return the equipment
  537.      */
  538.     public Equipment getEquipment() {
  539.         return equipment;
  540.     }
  541.  
  542.     /**
  543.      * @param equipment the equipment to set
  544.      */
  545.     public void setEquipment(Equipment equipment) {
  546.         this.equipment = equipment;
  547.     }
  548.  
  549.     /**
  550.      * @return the inventory
  551.      */
  552.     public Inventory getInventory() {
  553.         return inventory;
  554.     }
  555.  
  556.     /**
  557.      * @param inventory the inventory to set
  558.      */
  559.     public void setInventory(Inventory inventory) {
  560.         this.inventory = inventory;
  561.     }
  562.  
  563.     /**
  564.      * @return the moneyPouch
  565.      */
  566.     public MoneyPouch getMoneyPouch() {
  567.         return moneyPouch;
  568.     }
  569.  
  570.     /**
  571.      * @param moneyPouch the moneyPouch to set
  572.      */
  573.     public void setMoneyPouch(MoneyPouch moneyPouch) {
  574.         this.moneyPouch = moneyPouch;
  575.     }
  576.  
  577.     /**
  578.      * @return the grandExchange
  579.      */
  580.     public GrandExchange getGrandExchange() {
  581.         return grandExchange;
  582.     }
  583.  
  584.     /**
  585.      * @param grandExchange the grandExchange to set
  586.      */
  587.     public void setGrandExchange(GrandExchange grandExchange) {
  588.         this.grandExchange = grandExchange;
  589.     }
  590.  
  591.     /**
  592.      * @return the actionBar
  593.      */
  594.     public ActionBar getActionBar() {
  595.         return actionBar;
  596.     }
  597.  
  598.     /**
  599.      * @param actionBar the actionBar to set
  600.      */
  601.     public void setActionBar(ActionBar actionBar) {
  602.         this.actionBar = actionBar;
  603.     }
  604.  
  605.     /**
  606.      * @return the abilityBook
  607.      */
  608.     public AbilityBook getAbilityBook() {
  609.         return abilityBook;
  610.     }
  611.  
  612.     /**
  613.      * @param abilityBook the abilityBook to set
  614.      */
  615.     public void setAbilityBook(AbilityBook abilityBook) {
  616.         this.abilityBook = abilityBook;
  617.     }
  618.  
  619.     /**
  620.      * @return the performanceManager
  621.      */
  622.     public PerformanceManager getPerformanceManager() {
  623.         return performanceManager;
  624.     }
  625.  
  626.     /**
  627.      * @param performanceManager the performanceManager to set
  628.      */
  629.     public void setPerformanceManager(PerformanceManager performanceManager) {
  630.         this.performanceManager = performanceManager;
  631.     }
  632.  
  633.     /**
  634.      * @return the interfaceManager
  635.      */
  636.     public InterfaceManager getInterfaceManager() {
  637.         return interfaceManager;
  638.     }
  639.  
  640.     /**
  641.      * @param interfaceManager the interfaceManager to set
  642.      */
  643.     public void setInterfaceManager(InterfaceManager interfaceManager) {
  644.         this.interfaceManager = interfaceManager;
  645.     }
  646.  
  647.     /**
  648.      * @return the dialogueInterpreter
  649.      */
  650.     public DialogueInterpreter getDialogueInterpreter() {
  651.         return dialogueInterpreter;
  652.     }
  653.  
  654.  
  655.     /**
  656.      * @param dialogueInterpreter the dialogueInterpreter to set
  657.      */
  658.     public void setDialogueInterpreter(DialogueInterpreter dialogueInterpreter) {
  659.         this.dialogueInterpreter = dialogueInterpreter;
  660.     }
  661.  
  662.  
  663.     /**
  664.      * @return the cs2ScriptManager
  665.      */
  666.     public CS2ScriptManager getCs2ScriptManager() {
  667.         return cs2ScriptManager;
  668.     }
  669.  
  670.     /**
  671.      * @param cs2ScriptManager the cs2ScriptManager to set
  672.      */
  673.     public void setCs2ScriptManager(CS2ScriptManager cs2ScriptManager) {
  674.         this.cs2ScriptManager = cs2ScriptManager;
  675.     }
  676.  
  677.     /**
  678.      * @return the emotesManager
  679.      */
  680.     public EmotesManager getEmotesManager() {
  681.         return emotesManager;
  682.     }
  683.  
  684.     /**
  685.      * @param emotesManager the emotesManager to set
  686.      */
  687.     public void setEmotesManager(EmotesManager emotesManager) {
  688.         this.emotesManager = emotesManager;
  689.     }
  690.  
  691.     /**
  692.      * @return the propertiesManager
  693.      */
  694.     public PropertiesManager getPropertiesManager() {
  695.         return propertiesManager;
  696.     }
  697.  
  698.     /**
  699.      * @param propertiesManager the propertiesManager to set
  700.      */
  701.     public void setPropertiesManager(PropertiesManager propertiesManager) {
  702.         this.propertiesManager = propertiesManager;
  703.     }
  704.  
  705.     /**
  706.      * @param session the session to set
  707.      */
  708.     public void setSession(GameSession session) {
  709.         this.session = session;
  710.     }
  711.  
  712. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement