viperous

ViperousQuest

Jun 12th, 2011
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 17.30 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using COFarmerPluginLibrary;
  6.  
  7. namespace ViperousQuests {
  8.     public class Plugin : COFarmerPluginLibrary.ICOFarmerPlugin {
  9.  
  10.         //Debug Message?
  11.         public static bool debugMsg { get; set; }
  12.        
  13.         //Initialize Cases
  14.         public static Cases mainCase = new Cases();
  15.  
  16.        
  17.  
  18.  
  19.         public string Author { get { return "Viperous"; } }
  20.         public string Name { get { return "ViperousQuests Plugin"; } }
  21.         public string Version { get { return "0.0.1.0"; } }
  22.  
  23.         public void Main() {
  24.             debugMsg = false;
  25.         }
  26.  
  27.         public void OnClient(COFarmerClient _client) {
  28.  
  29.             if (debugMsg) { _client.Log("[ViperousQuests]: OnClient."); }
  30.  
  31.             if (mainCase.mainCase == Cases.MainCases.AbortScript) {
  32.                 //Plugin Error Tell restart Client and do nothing anymore!
  33.                 _client.Log("[ViperousQuests]: ERROR, Plugin will do nothing till next restart of COF! Sorry!");
  34.                 return;
  35.             }
  36.  
  37.             //Register Methods
  38.             _client.OnProcess += Plugin.OnProcess;
  39.  
  40.  
  41.             //Register Commands
  42.             _client.AddCommand("vq_savethetree", new OnCommandDelegate(Plugin.SaveTheTree));
  43.  
  44.             _client.AddCommand("vq_showdew", new OnCommandDelegate(Plugin.ShowDew));
  45.  
  46.             _client.AddCommand("vq_abort", new OnCommandDelegate(Plugin.Abort));
  47.  
  48.            
  49.  
  50.             //A Client logged in, so create new QuestClasses and Cases
  51.             Cases clientCase = new Cases();
  52.             clientCase.resetCases();
  53.  
  54.             _client.Session.Add("currentCase", clientCase);
  55.  
  56.  
  57.             //Create Quest Classes
  58.             SaveTheTree clientQuestSaveTheTree = new SaveTheTree();
  59.             _client.Session.Add("questSaveTheTree", clientQuestSaveTheTree);
  60.  
  61.         }
  62.  
  63.         public static void ShowDew(COFarmerClient _client, string _str, string[] _args) {
  64.             SaveTheTree questSaveTheTree;
  65.             if (!_client.GetSessionVariable("questSaveTheTree", out questSaveTheTree)) { mainCase.mainCase = Cases.MainCases.AbortScript; return; }
  66.  
  67.             _client.Log(Convert.ToString(questSaveTheTree.getUseDew()));
  68.         }
  69.  
  70.         /// <summary>
  71.         /// Method to Start the SaveTheTree Quest.
  72.         /// </summary>
  73.         /// <param name="_client">The Client Object</param>
  74.         /// <param name="_str">Don't Know yet :D</param>
  75.         /// <param name="__args">As Argument can be passed how many Dews should be used, if no passed it will use max 300.</param>
  76.         /// <returns></returns>
  77.         public static void SaveTheTree(COFarmerClient _client, string _str, string[] _args) {
  78.  
  79.             if (debugMsg) { _client.Log("[ViperousQuests]: SaveTheTree."); }
  80.  
  81.             SaveTheTree questSaveTheTree;
  82.             Cases clientCase;
  83.  
  84.             //trying to get neccessary Objects, else abort
  85.             if (!_client.GetSessionVariable("questSaveTheTree", out questSaveTheTree)) { mainCase.mainCase =Cases.MainCases.AbortScript; return; }
  86.             if (!_client.GetSessionVariable("currentCase", out clientCase)) { mainCase.mainCase = Cases.MainCases.AbortScript; return; }
  87.  
  88.             if (clientCase.saveTheTreeCase != Cases.SaveTheTreeCases.Idle) {
  89.                 _client.Log("[ViperousQuests]: SaveTheTree quest allready started and running! Doing nothing");
  90.                 return;
  91.             }
  92.  
  93.             uint dewCount;
  94.             if (_args.Count() > 1) {
  95.                 try {
  96.                     dewCount = Convert.ToUInt32(_args[1]);
  97.                 } catch ( Exception ) {
  98.                     dewCount = 300;
  99.                 }
  100.             } else {
  101.                 //Use 300 Dews
  102.                 dewCount = 300;
  103.             }
  104.  
  105.             //Not less then 0 (can't be cause of var type) and not more than 300)
  106.             if (dewCount < 0 || dewCount > 300) {
  107.                 dewCount = 300;
  108.             }
  109.  
  110.  
  111.             questSaveTheTree.setUseDews(dewCount);
  112.  
  113.  
  114.             //Set the Case to SaveTheTree and savethetreeevencase to entry
  115.             clientCase.questCase = Cases.QuestCases.SaveTheTree;
  116.             clientCase.saveTheTreeCase = Cases.SaveTheTreeCases.Entry;
  117.            
  118.         }
  119.  
  120.  
  121.         public static void OnProcess(COFarmerClient _client, uint _time) {
  122.  
  123.             //if (debugMsg) { _client.Log("[ViperousQuests]: onProcess."); }
  124.  
  125.             if (mainCase.mainCase == Cases.MainCases.AbortScript) {
  126.                 //Plugin Error Tell restart Client and do nothing anymore!
  127.                 _client.Log("[ViperousQuests]: ERROR, Plugin will do nothing till next restart of COF! Sorry!");
  128.                 return;
  129.             }
  130.  
  131.             Cases clientCase;
  132.             SaveTheTree questSaveTheTree;
  133.  
  134.             //trying to get neccessary Objects, else abort
  135.             if (!_client.GetSessionVariable("questSaveTheTree", out questSaveTheTree)) { mainCase.mainCase = Cases.MainCases.AbortScript; return; }
  136.             if (!_client.GetSessionVariable("currentCase", out clientCase)) { mainCase.mainCase = Cases.MainCases.AbortScript; return; }
  137.  
  138.             if (clientCase.mainCase == Cases.MainCases.AbortScript) {
  139.                 //Stop the execution of the script and reset cases
  140.                 clientCase.resetCases();
  141.             } else if (clientCase.mainCase == Cases.MainCases.RunScript) {
  142.                 switch (clientCase.questCase) {
  143.                     case Cases.QuestCases.Idle:
  144.                         //Simply do nothing :-)
  145.                         break;
  146.                     case Cases.QuestCases.SaveTheTree:
  147.                         //Do the SaveTheTreeQuest. Use the Process Method of SaveTheTree Class
  148.                         //  So this file doesnt get 1million lines long.
  149.                         questSaveTheTree.onProcess(_client, _time, clientCase);
  150.                         break;
  151.                 }
  152.             }
  153.  
  154.  
  155.  
  156.  
  157.         }
  158.  
  159.         /// <summary>
  160.         /// Method that aborts the execution of scripts and pushes the Plugin to "Idle" mode.
  161.         /// </summary>
  162.         /// <param name="_client">The Client Object</param>
  163.         /// <param name="_str">Don't Know yet :D</param>
  164.         /// <param name="__args">Not Used</param>
  165.         /// <returns></returns>
  166.         public static void Abort(COFarmerClient _client, string _str, string[] _args) {
  167.             if (debugMsg) { _client.Log("[ViperousQuests]: Abort."); }
  168.             Cases clientCase;
  169.  
  170.             //trying to get neccessary Objects, else abort
  171.             if (!_client.GetSessionVariable("currentCase", out clientCase)) { mainCase.mainCase = Cases.MainCases.AbortScript; return; }
  172.  
  173.             clientCase.mainCase = Cases.MainCases.AbortScript;
  174.         }
  175.  
  176.         public void OnClientToServer(COFarmerClient Client, Packet Packet) {        }
  177.         public void OnServerToClient(COFarmerClient Client, Packet Packet) {        }
  178.     }
  179. }
  180.  
  181. //---------------------cases.cs
  182. using System;
  183. using System.Collections.Generic;
  184. using System.Linq;
  185. using System.Text;
  186.  
  187. namespace ViperousQuests {
  188.     public class Cases {
  189.  
  190.         public  enum MainCases {
  191.             RunScript,
  192.             AbortScript
  193.         }
  194.  
  195.         public  enum QuestCases {
  196.             Idle,
  197.             SaveTheTree
  198.         }
  199.  
  200.         public  enum SaveTheTreeCases {
  201.             Idle,
  202.             Entry,
  203.             CheckPlace,
  204.             Traveling,
  205.             CheckDew,
  206.             WaterTree,
  207.             End,
  208.         }
  209.  
  210.        
  211.         public MainCases mainCase { get; set; }
  212.         public QuestCases questCase { get; set; }
  213.         public SaveTheTreeCases saveTheTreeCase { get; set; }
  214.  
  215.         public Cases() {
  216.             resetCases();
  217.         }
  218.  
  219.         public void resetCases() {
  220.             mainCase = MainCases.RunScript;
  221.             questCase = QuestCases.Idle;
  222.  
  223.             //Got to fill up on adding new Events!
  224.             saveTheTreeCase = SaveTheTreeCases.Idle;
  225.         }
  226.     }
  227. }
  228.  
  229. //--------------------------SaveTreeQuest
  230. using System;
  231. using System.Collections.Generic;
  232. using System.Linq;
  233. using System.Text;
  234. using COFarmerPluginLibrary;
  235.  
  236. namespace ViperousQuests {
  237.     class SaveTheTree {
  238.  
  239.         public uint useDews { get; set; }
  240.  
  241.  
  242.         private int placeCheckedInRow { get; set; }
  243.        
  244.         private uint timeLastWatered { get; set; }
  245.         private uint timeLastSkipped { get; set; }
  246.  
  247.         private Location lastLoc { get; set; }
  248.         private uint lastLocTime { get; set; }
  249.        
  250.  
  251.        
  252.        
  253.  
  254.         //Static Defines
  255.  
  256.         private static int placeCheckInRowLimit = 5;
  257.  
  258.        
  259.         private static uint travelingCheckMoveInterval = 500;
  260.  
  261.         private static int waterWaitTime = 14000;
  262.  
  263.         private static int waterWaitExceptionTime = 30000;
  264.  
  265.  
  266.         private static Location treeLoc = new Location(1002, new Point(426, 389));
  267.  
  268.         private static int dewTypeID = 727386;
  269.  
  270.         private static uint[] treeNPCIds = new uint[] { 8949, 8950, 8951, 8952 };
  271.  
  272.         public SaveTheTree() {
  273.             useDews = 300;
  274.             placeCheckedInRow = 0;
  275.  
  276.             timeLastWatered = 0;
  277.             timeLastSkipped = 0;
  278.  
  279.  
  280.             lastLoc = null;
  281.             lastLocTime = 0;
  282.         }
  283.  
  284.         public void onProcess(COFarmerClient _client, uint _time, Cases _clientCase) {
  285.  
  286.             switch (_clientCase.saveTheTreeCase) {
  287.  
  288.                 case Cases.SaveTheTreeCases.Idle:
  289.                     //Should never come here
  290.                     _client.Log("[ViperousQuests]Save the Tree: Quest in idle mode, this should never happen. Reseting Quest.");
  291.                     _clientCase.saveTheTreeCase = Cases.SaveTheTreeCases.End;
  292.                     break;
  293.                 case Cases.SaveTheTreeCases.Entry:
  294.                     _client.Log("[ViperousQuests]Save the Tree: Starting quest.");
  295.                     _clientCase.saveTheTreeCase = Cases.SaveTheTreeCases.CheckPlace;
  296.                     break;
  297.  
  298.                 case Cases.SaveTheTreeCases.CheckPlace:
  299.                     if (ViperousQuests.Plugin.debugMsg) { _client.Log("[Debug][ViperousQuest]Save the Tree: CheckPlace"); }
  300.                     //Check if your at right Position, if not Travel :D
  301.                     Location curLoc = new Location(_client.DynamicMapID, _client.Location);
  302.  
  303.                     if (ViperousQuests.Plugin.debugMsg) { _client.Log("[Debug][ViperousQuest]Save the Tree: CheckPlace: CurLoc: X:" + curLoc.Coordinate.X + " Y: " + curLoc.Coordinate.Y); }
  304.  
  305.                     if (curLoc != treeLoc) {
  306.                         if (ViperousQuests.Plugin.debugMsg) { _client.Log("[Debug][ViperousQuest]Save the Tree: CheckPlace: Travel"); }
  307.                        
  308.                         //Something wrong, gotta Travel
  309.                         _client.TravelTo(treeLoc.MapID, treeLoc.Coordinate);
  310.  
  311.                         _clientCase.saveTheTreeCase = Cases.SaveTheTreeCases.Traveling;
  312.  
  313.                         break;
  314.  
  315.                        
  316.                     } else {
  317.                         //Right place proceed to next case
  318.                         _clientCase.saveTheTreeCase = Cases.SaveTheTreeCases.CheckDew;
  319.                     }
  320.  
  321.                     break;
  322.  
  323.                 case Cases.SaveTheTreeCases.Traveling:
  324.                     //Check if the Client is really Traveling
  325.  
  326.                     if (lastLoc == null) {
  327.                         //first Check, save Cords and time
  328.                         lastLoc = new Location(_client.DynamicMapID, _client.Location);
  329.                         lastLocTime = _time;
  330.                         break;
  331.                     } else {
  332.                         //Check if time is ready for a traveling check
  333.                         if (_time - lastLocTime > travelingCheckMoveInterval) {
  334.                             if (ViperousQuests.Plugin.debugMsg) { _client.Log("[Debug][ViperousQuest]Save the Tree: Traveling: Time to check if moving"); }
  335.                             Location tmpLoc = new Location(_client.DynamicMapID, _client.Location);
  336.                             lastLocTime = _time;
  337.                             if (lastLoc == tmpLoc) {
  338.                                 //Client dont move, means he is at target or cant go to target, make a checkPlace
  339.                                 _clientCase.saveTheTreeCase = Cases.SaveTheTreeCases.CheckPlace;
  340.  
  341.                                 //Dont change case so it will be checked again. To prevent a dead End count var
  342.                                 placeCheckedInRow++;
  343.  
  344.                                 if (placeCheckedInRow > placeCheckInRowLimit) {
  345.                                     //Error happend, abort this Quest!
  346.                                     _client.Log("[ViperousQuests]Save the Tree: Error couldn't reach destination, tried: " + placeCheckedInRow + " times.");
  347.                                     _client.Log("[ViperousQuests]Save the Tree: Aborting SaveTheTree quest.");
  348.  
  349.                                     _clientCase.saveTheTreeCase = Cases.SaveTheTreeCases.End;
  350.                                     break;
  351.                                 }
  352.                             } else {
  353.                                 //Client is moving do nothing :)
  354.                             }
  355.                             lastLoc = tmpLoc;
  356.                         } else {
  357.                             //Just do nothing and wait till next traveling check is up
  358.                         }
  359.                     }
  360.                    
  361.                     break;
  362.  
  363.                 case Cases.SaveTheTreeCases.CheckDew:
  364.                     if (ViperousQuests.Plugin.debugMsg) { _client.Log("[Debug][ViperousQuest]Save the Tree: CheckDew"); }
  365.                     //Check if there are Dews Left, or allready used enough Dews
  366.  
  367.                     if (BCOHelper.CountItemID(_client, dewTypeID) <= 0) {
  368.                         //No Dews Left
  369.                         //I hate Dialog Boxes
  370.                         _client.AnswerNpc(6);
  371.                         _client.AnswerNpc(6);
  372.  
  373.                         _client.Log("[ViperousQuests]Save the Tree: No Dews left in inventory, ending.");
  374.                         _clientCase.saveTheTreeCase =Cases.SaveTheTreeCases.End;
  375.                         break;
  376.                     } else if (getUseDew() <= 0) {
  377.                         //Desired Dew Count reached
  378.                         //I hate Dialog Boxes
  379.                         _client.AnswerNpc(6);
  380.                         _client.AnswerNpc(6);
  381.  
  382.                         _client.Log("[ViperousQuests]Save the Tree: Desired Dew use count reached. Ending quest.");
  383.                         _clientCase.saveTheTreeCase = Cases.SaveTheTreeCases.End;
  384.                         break;
  385.                     }
  386.  
  387.                     //Everything good, water the tree :)
  388.                     _clientCase.saveTheTreeCase = Cases.SaveTheTreeCases.WaterTree;
  389.                    
  390.                     break;
  391.  
  392.                 case Cases.SaveTheTreeCases.WaterTree:
  393.                     //Wait at least 14s since last time watered till try another time
  394.                     if (_time - timeLastWatered >= waterWaitTime) {
  395.                         //I hate Dialog Boxes
  396.                         _client.AnswerNpc(6);
  397.                         _client.AnswerNpc(6);
  398.  
  399.                         //Waited long enough, do another Water! Reset Last Skipped Timer
  400.                         timeLastSkipped = _time;
  401.                        
  402.                         // Tree can have multiple IDs, try all
  403.                         for (int cnt = 0; cnt < treeNPCIds.Count(); cnt++) {
  404.                             _client.ClickNpc(treeNPCIds[cnt]);
  405.                         }
  406.  
  407.                         //Record time last Watered (well thats NOW :D)
  408.                         timeLastWatered = _time;
  409.  
  410.                         //decrease count
  411.                         setUseDews(getUseDew() - 1);
  412.  
  413.                         //Set case to CheckPlace
  414.                         _clientCase.saveTheTreeCase = Cases.SaveTheTreeCases.CheckPlace;
  415.                     }
  416.                     //Not waited long enough, do another WaterTree try
  417.  
  418.                     //Check if we have an error and wait allready a long time
  419.                     if (_time - timeLastSkipped > waterWaitExceptionTime) {
  420.                         //Error happend, abort this Quest!
  421.                         _client.Log("[ViperousQuests]Save the Tree: Error had to wait too long to water: " + waterWaitExceptionTime / 1000 + " s.");
  422.                         _client.Log("[ViperousQuests]Save the Tree: Aborting SaveTheTree quest.");
  423.                        
  424.                         _clientCase.saveTheTreeCase = Cases.SaveTheTreeCases.End;
  425.                         break;
  426.                     }
  427.                     break;
  428.  
  429.  
  430.                 case Cases.SaveTheTreeCases.End:
  431.                     _client.Log("[ViperousQuests]Save the Tree: The quest has been finished (or aborted, read the previous message.");
  432.                     //Set thisQuest Case to Idle
  433.                     _clientCase.saveTheTreeCase = Cases.SaveTheTreeCases.Idle;
  434.                     _clientCase.questCase = Cases.QuestCases.Idle;
  435.                     break;
  436.             }
  437.         }
  438.  
  439.  
  440.  
  441.         public void setUseDews(uint _dewCount){
  442.             useDews = _dewCount;
  443.         }
  444.         public uint getUseDew(){
  445.             return useDews;
  446.         }
  447.  
  448.     }
  449. }
Advertisement
Add Comment
Please, Sign In to add comment