mirror of
				https://bitbucket.org/Ioncannon/project-meteor-server.git
				synced 2025-05-20 08:26:59 -04:00 
			
		
		
		
	SetPushEventConditionWithTriggerBox & EventList.cs - Made changes to PushBoxEventCondition so it can function ingame if provided the correct parameters in the eventConditions in the gamedata_actor_class SQL. These are used for the Market Wards entrances in each city
MarketEntrance.lua - Script mostly laid out and documented. Some debugging info left in while various warp locations and PrivateAreas still need finishing up. CraftCommand.lua - WIP on crafting menu + minigame. Menu flow worked out for the most part, it's just a matter of plugging in various data for them to replace the debugging values I set currently. DummyCommand.lua - WIP on Mining minigame. Still lots missing but it's a start. Cannot use mining nodes ingame currently without modifying KickEventPacket.cs Removed orphaned individual ShopSalesman scripts since their info was tabled into a single script awhile back.
This commit is contained in:
		| @@ -4,20 +4,148 @@ MarketEntrance Script | ||||
|  | ||||
| Functions: | ||||
|  | ||||
| eventPushChoiceAreaOrQuest(gcLeaderPlaceName[Fronds, etc], showMarketWards/Houses (must be 0xc1a), gcHQPlaceName, anotherPlaceName, showItemSearchCounter, stopSearchingItemId) -  | ||||
| eventPushStepPrvMarket(?, ?, ?) - | ||||
| Parameters mostly rely on the xtx_placeName sheet for its strings. | ||||
|  | ||||
| eventPushChoiceAreaOrQuest( | ||||
|     exitPlaceName[Fronds, etc],     - Retail only showed it when inside a Market Ward/Office  Set to 0 to hide the menu. | ||||
|     showMarketWards/Houses          - If > 0, client script adds nation-specific Mercentile Houses as well. | ||||
|     gcHQPlaceName,                  - Set to the placeName id for the Grand Company office of that city | ||||
|     questAreaName,                  - Set to the placeName id of applicable quest instance, ex. Sailors Ward. | ||||
|     showItemSearchCounter,          - If true, shows the Item Search menu | ||||
|     itemSearchId                    - If > 0 & showItemSearchCounter = true, displays the item name with a "Stop Searching" | ||||
| ) | ||||
| eventPushStepPrvMarket( | ||||
|     staringWard,                    - Sets the starting placeName id | ||||
|     wardCount,                      - Valid number 1-20. Sets the amount of market ward entries. Client continues sequentially from startingWard id. | ||||
|     excludeWard                     - Hides the ward in the list that matches the id.  Use on the ward you're currently in. | ||||
| )  | ||||
|    | ||||
|    | ||||
| MarketEntrance City TriggerBox details | ||||
| Limsa    - !warp 230 -416.5 40 446 | ||||
|     bgObj  Id - [0xB3B] 2875 | ||||
|     Layout Id - [0x79 ] 121  (0x29d90001) | ||||
|     Condition - in | ||||
|     reactName - dwti    - Not a typo compared to the other cities | ||||
| Gridania - !warp 206 -192.57 23.48 -1407.58 | ||||
|     bgObj  Id - [0xCFA] 3322 | ||||
|     Layout Id - [0x141]  321 (0x29b00001) | ||||
|     Condition - in | ||||
|     reactName - dtwi | ||||
| Ul'dah   - !warp 175 -235 189 50.5 | ||||
|     bgObj  Id - [0x102F] 4143 | ||||
|     Layout Id - [0x1A5] 421  (0x615a0001) | ||||
|     Condition - in | ||||
|     reactName - dtwi | ||||
|  | ||||
| --]] | ||||
|  | ||||
| require ("global") | ||||
|  | ||||
| local MARKETWARD_ENTRANCE = {-201.0, 0.0, -160.0, 1.5}; | ||||
|  | ||||
| function init(npc) | ||||
| 	return false, false, 0, 0; | ||||
| end | ||||
|  | ||||
|  | ||||
| CITY_INFO = { -- wardPlaceName, exitPlaceName, gcHQPlaceName, questAreaName, wardListStart, wardListCount | ||||
|     {1093, 1087, 1512, 1091, 1261, 20}, -- Limsa | ||||
|     {2099, 2091, 2526, 2095, 2261, 20}, -- Gridania | ||||
|     {3098, 3091, 3514, 3095, 3261, 20}, -- Ul'dah | ||||
| } | ||||
|  | ||||
| -- TO-DO:  Add some X/Z pos jitter to Entrances/Exits when called | ||||
| MARKETWARD_ENTRANCE = { | ||||
|     {134, 160, 0, 135}, -- Limsa Market | ||||
|     {160, 160, 0, 138}, -- Gridania Market | ||||
|     {180, 160, 0, 185}  -- Ul'dah Market | ||||
| } | ||||
|  | ||||
| MARKETWARD_EXIT = { | ||||
|     {230, -420, 41, 435, -3.14},  -- Educated guess for Limsa, need video reference to confirm | ||||
|     {206, -180, 22, -1408, 1.5}, | ||||
|     {175, -210, 190, 25, 0.65} | ||||
| } | ||||
|  | ||||
| GC_ENTRANCE = {  | ||||
|     [1512] = {232, 160, 0, -155}, -- Maelstrom Command | ||||
|     [2526] = {234, 160, 0, -155}, -- Adders' Nest | ||||
|     [3514] = {233, 160, 0, -155}  -- Hall of Flames | ||||
| } | ||||
|  | ||||
| city = { | ||||
|     [1090238] = 1, -- Limsa Market Ward Entrance | ||||
|     [1090264] = 2, -- Gridania Market Ward Entrance | ||||
|     [1090265] = 3, -- Ul'dah Market Ward Entrance | ||||
|     [1500392] = 1, -- Limsa     : M'septha | ||||
|     [1500393] = 2, -- Gridania  : Torsefers | ||||
|     [1500394] = 3, -- Ul'dah    : Edine | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| function onEventStarted(player, npc, triggerName)	 | ||||
| 	callClientFunction(player, "eventPushChoiceAreaOrQuest", 0xc13, 0xc1a, 0xdba, 0, true, 1); | ||||
|  | ||||
|     local npcCity = city[npc:GetActorClassId()] or 1; | ||||
|     local wardPlaceName = CITY_INFO[npcCity][1];        -- Market Wards category name. Identical in all languages except Japanese | ||||
|     local exitPlaceName = CITY_INFO[npcCity][2];        -- Central Limsa Lominsa / Heartstream / The Fronds | ||||
|     local gcHQPlaceName = CITY_INFO[npcCity][3];        -- Maelstrom Command / Adders' Nest / Hall of Flames | ||||
|     local questAreaName = 0; --CITY_INFO[npcCity][4];   -- Sailors Ward / Peasants Ward / Merchants Ward | ||||
|     local wardListStart = CITY_INFO[npcCity][5];        -- Starting id for the market wards | ||||
|     local wardListCount = CITY_INFO[npcCity][6];        -- Amount of wards in the list | ||||
|     local showItemSearchCounter = false; | ||||
|     local itemSearchId = 11000125;    | ||||
|      | ||||
|     local worldMaster = GetWorldMaster();  | ||||
|     local pos = player:GetPos(); | ||||
|     local currZone = pos[4]; | ||||
|      | ||||
|     if (currZone == 133 or currZone == 230 or currZone == 155 or currZone == 206 or currZone == 175 or currZone == 209) then  | ||||
|         exitPlaceName = 0;  -- If in city, hide city menu option | ||||
|     elseif (currZone == 232 or currZone == 234 or currZone == 233) then  | ||||
|         gcHQPlaceName = 0;  -- If in GC Office, hide office menu option | ||||
|     end | ||||
|  | ||||
|     choice = callClientFunction(player, "eventPushChoiceAreaOrQuest", exitPlaceName, wardPlaceName, gcHQPlaceName, questAreaName, showItemSearchCounter, itemSearchId); | ||||
|          | ||||
|     while (true) do | ||||
|          | ||||
|         if choice == wardPlaceName then -- Market Wards | ||||
|             wardSelect = callClientFunction(player, "eventPushStepPrvMarket", wardListStart, wardListCount, 0); | ||||
|              | ||||
|             if wardSelect and (wardSelect >= wardListStart and wardSelect <= (wardListStart+wardListCount)) then | ||||
|                 player:SendGameMessage(player, worldMaster, 60004, 0x20, wardSelect); | ||||
|                 warp = MARKETWARD_ENTRANCE[npcCity]; | ||||
|                 playerRot = math.random(-3.14, 3.14); | ||||
|                 wait(1); | ||||
|                 GetWorldManager():DoZoneChange(player, warp[1], nil, 0, 0x02, warp[2], warp[3], warp[4], playerRot); | ||||
|                 player:SendDataPacket("attention", worldMaster, "", 60003, wardSelect); | ||||
|                 -- Temp: Pop-up display after Ward zone-in.  Client should automate this with PrivateArea's properly setup | ||||
|  | ||||
|                 break; | ||||
|             end | ||||
|              | ||||
|         elseif (choice == 1519 or choice == 2534 or choice == 3533) then -- Mercentile Wards | ||||
|                 player:SendMessage(0x20, "", "[MarketEntrance] DEBUG: "..choice); | ||||
|         elseif (choice == 1512 or choice == 2526 or choice == 3514) then -- GC Office | ||||
|                 warp = GC_ENTRANCE[choice]; | ||||
|                 player:SendGameMessage(player, worldMaster, 60004, 0x20, choice); | ||||
|                 wait(1); | ||||
|                 GetWorldManager():DoZoneChange(player, warp[1], nil, 0, 0x02, warp[2], warp[3], warp[4], math.pi); | ||||
|                 break; | ||||
|         elseif (choice == 1087 or choice == 2091 or choice == 3091) then -- Exiting to City | ||||
|                 player:SendGameMessage(player, worldMaster, 60004, 0x20, choice); | ||||
|                 warp = MARKETWARD_EXIT[npcCity]; | ||||
|                 wait(1); | ||||
|                 GetWorldManager():DoZoneChange(player, warp[1], nil, 0, 0x02, warp[2], warp[3], warp[4], warp[5]);           | ||||
|                 break; | ||||
|         elseif (choice == 0 or choice == -3) then -- Menu Closed | ||||
|             break;   | ||||
|         end  | ||||
|          | ||||
|         choice = callClientFunction(player, "eventPushChoiceAreaOrQuest", exitPlaceName, wardPlaceName, gcHQPlaceName, questAreaName, showItemSearchCounter, itemSearchId); | ||||
|            | ||||
|     end | ||||
|      | ||||
| 	player:EndEvent();	 | ||||
|      | ||||
| end | ||||
							
								
								
									
										452
									
								
								Data/scripts/commands/CraftCommand.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										452
									
								
								Data/scripts/commands/CraftCommand.lua
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,452 @@ | ||||
| --[[ | ||||
|  | ||||
| CraftJudge  | ||||
|  | ||||
| Operates the Crafting system. | ||||
|  | ||||
| Functions: | ||||
|  | ||||
| loadTextData()   | ||||
| 	Desc: Loads all gamesheets needed and instantiates a CraftJudge. | ||||
| 	Params: None | ||||
|  | ||||
| start(facility, requestsMode, material1, material2, material3, material4, material5, material6, material7, material8) | ||||
|     Desc: Opens the Craft Start widget, with any preloaded materials. Widget has two modes; one for normal synthesis and another | ||||
|           for local leve "requested items" mode. | ||||
|     Params: * facility/widgetMode   - The current facility id buff the player may have. After opening a recipe tab, start() has to be called with this | ||||
|                                       set to -1. After the player chooses a recipe, start() has to be called with this set to -2. | ||||
|             * requestMode           - If true, switches the UI to Requested Items mode otherwise it opens Normal Synthesis mode. | ||||
|             * material1-8           - ItemID for each of the 8 material slots. If empty, they must be set to 0 or the client will crash. | ||||
| 		 | ||||
| closeCraftStartWidget() | ||||
| 	Desc: Closes the Craft Start widget. | ||||
| 	Params: None | ||||
|  | ||||
| selectRcp(item1, item2, item3, item4, item5, item6, item7, item8) | ||||
|     Desc:     Opens a recipe selection window. If one recipe is provided, automatically selects that recipe. | ||||
|     Params:    * itemId1-8                - The itemIDs to show in the list. If only one provided, select it. | ||||
| 	 | ||||
| confirmRcp(craftedItem, quantity, crystalItem1, crystalQuantity1, crystalQuantity1, crystalItem2, crystalQuantity2, recommendedSkill, recommendedFacility) | ||||
|     Desc: Opens the confirmation window, detailing what is needed and the item that will be created. Requires a selectRcp() call first. | ||||
|     Params: * craftedItem           - The itemID of the item to be crafted. | ||||
|             * quantity              - Quantity of crafted items. | ||||
|             * crystalItem1          - The first required crystal itemID for crafting. | ||||
|             * crystalQuantity1      - Quantity of the first crystal. | ||||
|             * crystalItem2          - The second required crystal itemID for crafting. | ||||
|             * crystalQuantity2      - Quantity of the second crystal. | ||||
|             * recommendedSkill      - Which itemID to display under the "Recommended Skill" panel. | ||||
|             * recommendedFacility   - Which facility to display under the "Recommended Facility" panel. | ||||
|  | ||||
| selectCraftQuest() | ||||
| 	Desc: Opens the journal to select the local leve that the player would like to do. | ||||
| 	Params: None | ||||
|  | ||||
| confirmLeve() | ||||
| 	Desc: Opens the summery page for the local leve. | ||||
| 	Params: * localLeveID			- | ||||
| 			* craftedItem			- | ||||
| 			* ? | ||||
| 			* ? | ||||
| 			* itemsCompleted		- | ||||
| 			* remainingMaterials	- | ||||
| 			* ? | ||||
| 			* ? | ||||
|  | ||||
| askContinueLocalLeve(localLeveID, craftedItem, itemsCompleted, craftTotal, attempts) | ||||
| 	Desc: Opens the dialog to continue crafting for a local leve after an item was completed. | ||||
| 	Params: * localLeveID			- The id of the current leve in progress. | ||||
| 			* craftedItem			- The current crafted item id. | ||||
| 			* itemsCompleted		- Number of items crafted so far. | ||||
| 			* craftTotal			- Number of items to be crafted in total. | ||||
| 			* attempts				- The number of attempts left. | ||||
|  | ||||
| askRetryLocalleve(localLeveID, allowanceCount) | ||||
| 	Desc: Opens the dialog to retry the local leve (at the expense of an allowance) if the player had failed it. | ||||
| 	Params: * localLeveID			- The failed level id. | ||||
| 			* allowanceCount		- How many allowances the player has. | ||||
|  | ||||
| openCraftProgressWidget(durability, quality, hqChance) | ||||
| 	Desc: Opens the crafting minigame, sets starting values. | ||||
| 	Params: * durability			- Durability of the current item. | ||||
| 			* quality				- Starting quality of the current item. | ||||
| 			* hqChance				- Starting chance to get a HQ item. | ||||
|  | ||||
| craftCommandUI(classID, hasWait, command1, command2, command3, command4, command5) | ||||
| 	Desc: Sets the available command list and waits for the player to select a command. | ||||
| 	Params: | ||||
| 			* classID				- The current crafting class. Must be set properly to show the three synthesis commands. | ||||
| 			* hasWait				- If true, adds the wait command. | ||||
| 			* command1-5			- Five possible crafting commands (crafting skills). | ||||
|  | ||||
| craftTuningUI(command1, command2, command3, command4, command5, command6, command7, command8) | ||||
| 	Desc: Displays a full list of commands for the legacy "Tuning" phase that happens after crafting. Deprecated in 1.23b. | ||||
| 	Params: * command1-8			- The list of commands available. | ||||
|  | ||||
| updateInfo(progress, durability, quality, tuningItem, tuningItemQuality, tuningItemQuantity, hqChance) | ||||
| 	Desc: Updates the progress UI components and text boxes. | ||||
| 	Params: * progress				- The current crafting progress percentage. Value is from 0 to 100. | ||||
| 			* durability			- The current durability of the crafted item. | ||||
| 			* quality				- The current quality of the crafted item. | ||||
| 			* tuningItem			- The crafted item to show in the Tuning UI. Nil if crafting. Deprecated in 1.23b. | ||||
| 			* tuningItemQuality 	- The quality of the item to show in the Tuning UI. Nil if crafting. Deprecated in 1.23b. | ||||
| 			* tuningItemQuantity	- The amount of the item to show in the Tuning UI. Nil if crafting. Deprecated in 1.23b. | ||||
| 			* hqChance				- The current chance of an HQ craft. | ||||
|  | ||||
| closeCraftProgressWidget() | ||||
| 	Desc: Closes the crafting minigame widget. | ||||
| 	Params: None | ||||
| 	 | ||||
| cfmQst() | ||||
| 	Desc: Quest confirmation window for when starting a crafting quest from the journal. | ||||
| 	Params: | ||||
|  | ||||
| startRepair(craftMode, item, quality, durability, hasMateria, spiritbind) | ||||
| 	Desc: Opens the repair item widget. | ||||
| 	Params: * craftMode				- Either 0 or 1. Anything else crashes. | ||||
| 			* item					- ItemID of the item to be repaired. | ||||
| 			* quality				- Quality of the item to be repaired. | ||||
| 			* durability			- Durability of the item to be repaired. | ||||
| 			* hasMateria			- Shows an icon if the item to be repaired has materia attached. | ||||
| 			* spiritbind			- Spiritbind of the item to be repaired. | ||||
|  | ||||
| askJoinMateria() | ||||
| displayRate() | ||||
|  | ||||
| askJoinResult(isSuccess, item, itemQuality, materia, materiaNumber, isSpiritBound) | ||||
| 	Desc: Opens the result widget after materia melding is done. | ||||
| 	Params: * isSuccess				- True if the meld was successful. | ||||
| 			* item					- Item ID of the melded item. | ||||
| 			* quality				- Quality of the melded item. | ||||
| 			* materia				- Item ID of the materia being melded. | ||||
| 			* materiaNumber			- Total count of materia on the item. | ||||
| 			* isSpiritBound			- True if the item is spiritbound. Causes icon to appear. | ||||
| 	 | ||||
| Notes: | ||||
|  | ||||
| Class ID + Starting skill | ||||
|  29 CRP = 22550 | ||||
|  30 BSM = 22556 | ||||
|  31 ARM = 22562 | ||||
|  32 GSM = 22568 | ||||
|  33 LTW = 22574 | ||||
|  34 WVR = 22580 | ||||
|  35 ALC = 22586 | ||||
|  36 CUL = 22592 | ||||
|  | ||||
|  | ||||
| --]] | ||||
|  | ||||
| require ("global") | ||||
|  | ||||
|  | ||||
| skillAnim = { | ||||
|     [22553] = 0x10002000; | ||||
|     [22554] = 0x10001000; | ||||
|     [22555] = 0x10003000; | ||||
|     [29531] = 0x10009002; | ||||
| } | ||||
|  | ||||
|  | ||||
| materialSlots = {0,0,0,0,0,0,0,0};   -- The 8 slots | ||||
| recentRecipe = {10008205, 4030706, 4070009} -- Recent Recipe list | ||||
| awardedRecipe = {7020105, 7030011}          -- Awarded Recipe list | ||||
|  | ||||
| materialRecipe = { -- Always 8 params because we can't have any nils here for "start" command | ||||
|     [6071007] = {4070402, 4070309,0,0,0,0,0,0}, | ||||
|     [10008205] = {10008005,10008005,0,0,0,0,0,0}, | ||||
|     [10009617] = {4040009, 4040010, 4040011,0,0,0,0,0}, | ||||
|     [4070009] = {4070006, 10005401, 10008203,0,0,0,0,0}, | ||||
|     [4070010] = {10008204,10008106,10005302,0,0,0,0,0} | ||||
| } | ||||
|  | ||||
| materialQuest = { -- What a quest or leve will preload slots with, in addition to any extras the player does manual | ||||
|     [0] = {0,0,0,0,0,0,0,0}, | ||||
|     [1] = {0,0,0,0,0,0,0,0}, | ||||
|     [110442] = {11000075, 11000074, 0, 0, 0, 0, 0, 0} | ||||
| } | ||||
|  | ||||
|  | ||||
| function onEventStarted(player, commandactor, triggerName, arg1, arg2, arg3, arg4, checkedActorId) | ||||
|  | ||||
|     MENU_CANCEL, MENU_MAINHAND, MENU_OFFHAND, MENU_REQUEST = 0, 1, 2, 3; | ||||
|     MENU_RECIPE, MENU_AWARDED, MENU_RECIPE_DETAILED, MENU_AWARDED_DETAILED = 7, 8, 9, 10; | ||||
|      | ||||
|     debugMessage = false; | ||||
|  | ||||
|     isRecipeRecentSent = false; | ||||
|     isRecipeAwardSent = false; | ||||
|     detailWindow = true; | ||||
|     isRequested = false;  -- False = The default state.  True = User picked a quest recipe/local leve | ||||
|     facilityId = 0; | ||||
|     chosenQuest = 0;  -- Use this to store any chosen recipe/local leve | ||||
|     recipeDetail = 0; | ||||
|     detailWindowState = 0; | ||||
|      | ||||
| 	craftJudge = GetStaticActor("CraftJudge"); | ||||
|     callClientFunction(player, "delegateCommand", craftJudge, "loadTextData", commandactor); | ||||
|      | ||||
|     chosenOperation = -1; | ||||
|     | ||||
|  | ||||
|     while chosenOperation ~= 0 do | ||||
|          | ||||
|         player:ChangeState(30); | ||||
|          | ||||
|         if debugMessage then player:SendMessage(0x20, "", "[DEBUG] Menu ID: "..tostring(chosenOperation).."   Recipe : "..tostring(recipeMode).."   Quest : "..chosenQuest); end | ||||
|          | ||||
|          | ||||
|         if materialQuest[chosenQuest] then | ||||
|             if debugMessage then player:SendMessage(0x20, "", "Key is valid: "..chosenQuest); end | ||||
|             materialSlots = materialQuest[chosenQuest]; | ||||
|         else | ||||
|             if debugMessage then player:SendMessage(0x20, "", "Key is not valid: "..chosenQuest); end | ||||
|         end | ||||
|  | ||||
|          | ||||
|         if isRecipeRecentSent == false then  -- If Recipe button not hit, aka default state. | ||||
|             chosenOperation, recipeMode = callClientFunction(player, "delegateCommand", craftJudge, "start", commandactor, facilityId, isRequested, unpack(materialSlots));  -- Initial window | ||||
|  | ||||
|         elseif isRecipeRecentSent == true and recipeMode == 0 then -- If recipe window/award tab was hit | ||||
|             chosenOperation, recipeMode = callClientFunction(player, "delegateCommand", craftJudge, "start", commandactor, -1, isRequested, unpack(materialSlots));  -- Keep window going | ||||
|  | ||||
|         elseif isRecipeRecentSent == true and recipeMode > 0 then  -- If recipe item picked | ||||
|             if recipeDetail then  | ||||
|                 chosenOperation, recipeMode = callClientFunction(player, "delegateCommand", craftJudge, "start", commandactor, -2, isRequested, unpack(recipeDetail)); -- Item mat(s) for picked item. | ||||
|             else | ||||
|                 chosenOperation, recipeMode = callClientFunction(player, "delegateCommand", craftJudge, "start", commandactor, -2, isRequested, 10009617,0,0,0,0,0,0,0); -- Show dummy info for unfilled item | ||||
|             end | ||||
|         end      | ||||
|          | ||||
|          | ||||
|         if chosenOperation == MENU_CANCEL then  | ||||
|             callClientFunction(player, "delegateCommand", craftJudge, "closeCraftStartWidget", commandactor); | ||||
|              | ||||
|              | ||||
|         elseif (chosenOperation == MENU_MAINHAND or chosenOperation == MENU_OFFHAND) then  | ||||
|              | ||||
|             if isRequested == true then | ||||
|                 recipeResult = callClientFunction(player, "delegateCommand", craftJudge, "selectRcp", commandactor, 10009617); | ||||
|             else | ||||
|                 recipeResult = callClientFunction(player, "delegateCommand", craftJudge, "selectRcp", commandactor, 10009617,6071007,5030112,5030007,10009617,6071007,5030112,5030007);   | ||||
|             end | ||||
|              | ||||
|             if recipeResult == 0 then -- Closed/Return hit. | ||||
|                 callClientFunction(player, "delegateCommand", craftJudge, "closeCraftStartWidget", commandactor); | ||||
|                 currentlyCrafting = -1; | ||||
|  | ||||
|             elseif (recipeResult >= 1 or recipeResult <= 8) then | ||||
|                                                                                                 --item  yld, xstal1, qty,   xstal2, qty | ||||
|                 recipeConfirmed = callClientFunction(player, "delegateCommand", craftJudge, "confirmRcp", commandactor, 10009617, 1, 0xF4247, 1, 0xf4245, 1, 0, 0);  | ||||
|  | ||||
|                 if recipeConfirmed then | ||||
|                     callClientFunction(player, "delegateCommand", craftJudge, "closeCraftStartWidget", commandactor); | ||||
|                     isRecipeRecentSent = false; | ||||
|                     isRecipeAwardSent = false; | ||||
|                     currentlyCrafting = startCrafting(player, chosenOperation, isRequested, 80, 100, 50);  | ||||
|                 end | ||||
|             end | ||||
|  | ||||
|         elseif chosenOperation == MENU_REQUEST then -- Conditional button label based on isRequested                  | ||||
|             if isRequested == false then    -- "Request Items" hit, close Start and open up the Quest select | ||||
|                 callClientFunction(player, "delegateCommand", craftJudge, "closeCraftStartWidget", commandactor); | ||||
|                 isRecipeRecentSent = false; | ||||
|                 isRecipeAwardSent = false;                     | ||||
|                  | ||||
|                 local questConfirmed, returnedQuest = GetCraftQuest(player, craftjudge, commandactor); | ||||
|                 chosenQuest = tonumber(returnedQuest); | ||||
|                  | ||||
|                 if debugMessage then player:SendMessage(0x20, "", "[DEBUG] Chosen Quest: "..tostring(chosenQuest)); end | ||||
|                      | ||||
|                 if questConfirmed then | ||||
|                     isRequested = true;    | ||||
|                 end | ||||
|              | ||||
|                  | ||||
|             elseif isRequested == true then -- "Normal Synthesis" button hit    | ||||
|                 isRequested = false; | ||||
|                 chosenQuest = 0; | ||||
|                 callClientFunction(player, "delegateCommand", craftJudge, "closeCraftStartWidget", commandactor); | ||||
|              | ||||
|             end | ||||
|          | ||||
|         elseif chosenOperation == MENU_RECIPE then -- "Recipes" button hit | ||||
|             if isRecipeRecentSent == false then | ||||
|                 callClientFunction(player, "delegateCommand", craftJudge, "selectRcp", commandactor, unpack(recentRecipe)); -- Load up recipe list | ||||
|                 isRecipeRecentSent = true; | ||||
|             end | ||||
|  | ||||
|             recipeDetail = materialRecipe[recentRecipe[recipeMode]]; | ||||
|  | ||||
|         elseif chosenOperation == MENU_AWARDED then -- "Awarded Recipes" tab hit   | ||||
|             if isRecipeAwardSent == false then | ||||
|                 callClientFunction(player, "delegateCommand", craftJudge, "selectRcp", commandactor, unpack(awardedRecipe)); -- Load up Award list | ||||
|                 isRecipeAwardSent = true; | ||||
|             end | ||||
|              | ||||
|             recipeDetail = materialRecipe[awardedRecipe[recipeMode]]; | ||||
|            | ||||
|         elseif (chosenOperation == MENU_RECIPE_DETAILED or chosenOperation == MENU_AWARDED_DETAILED) and recipeMode > 0 then -- Pop-up for an item's stats/craft mats | ||||
|             detailWindowState = callClientFunction(player, "delegateCommand", craftJudge, "confirmRcp", commandactor, 10009617, 1, 0xF4247, 1, 0xf4245, 1, 0, 0); | ||||
|  | ||||
|         else | ||||
|             break; | ||||
|         end | ||||
|     end | ||||
|      | ||||
|     player:ChangeMusic(51); | ||||
|     player:ChangeState(0); | ||||
|     player:EndEvent(); | ||||
| 	 | ||||
| end | ||||
|  | ||||
|  | ||||
|  | ||||
| -- Handles the menus to pick a crafter quest or local leve quest that run separate widgets from the Start command. | ||||
| -- Returns whether a quest was selected, and what id the quest is. | ||||
| function GetCraftQuest(player, craftjudge, commandactor); | ||||
|  | ||||
|     local questOffset = 0xA0F00000; | ||||
|     local questId = 0; | ||||
|     local requestState = false;                   | ||||
|     local requestedMenuChoice = callClientFunction(player, "delegateCommand", craftJudge, "selectCraftQuest", commandactor); | ||||
|      | ||||
|     if requestedMenuChoice then | ||||
|         questId = requestedMenuChoice - questOffset; | ||||
|          | ||||
|         if isCraftQuest(questId) then                                                             | ||||
|             confirm = callClientFunction(player, "delegateCommand", craftJudge, "cfmQst", commandactor, questId, 20, 1, 1, 1, 0, 0, "<Path Companion>"); | ||||
|              | ||||
|             if confirm == true then | ||||
|                 requestState = true; | ||||
|                 player:SendGameMessage(craftJudge, 21, 0x20); | ||||
|             end                             | ||||
|              | ||||
|         elseif isLocalLeve(questId) then | ||||
|             confirm = callClientFunction(player, "delegateCommand", craftJudge, "confirmLeve", commandactor, questId, 0, 8030421, 5, 50, 0, 0); | ||||
|              | ||||
|             if confirm == true then | ||||
|                 requestState = true; | ||||
|                 itemSlots = { unpack(materialRecipe[4070010])}; | ||||
|             end | ||||
|  | ||||
|         elseif isScenarioQuest(questId) == true then | ||||
|             -- TEMP for now. Cannot find source for what happens if you confirm a non-craft quest. | ||||
|            player:SendGameMessage(GetWorldMaster(), 40209, 0x20);  | ||||
|         end | ||||
|     end | ||||
|  | ||||
|     return requestState, questId; | ||||
| end | ||||
|  | ||||
|  | ||||
| function isScenarioQuest(id) | ||||
|  | ||||
|     if (id >= 110001 and id <= 120026) then | ||||
|         return true; | ||||
|     else | ||||
|         return false; | ||||
|     end | ||||
| end | ||||
|  | ||||
|  | ||||
| function isCraftQuest(id) | ||||
|     if (id >= 110300 and id <= 110505) then | ||||
|         return true; | ||||
|     else | ||||
|         return false; | ||||
|     end | ||||
| end | ||||
|  | ||||
|  | ||||
| function isLocalLeve(id) | ||||
|  | ||||
|     if (id >= 120001 and id <= 120452) then | ||||
|         return true; | ||||
|     else | ||||
|         return false; | ||||
|     end | ||||
| end | ||||
|  | ||||
|  | ||||
| -- No real logic in this function.  Just smoke and mirrors to 'see' the minigame in action at the minimum level. | ||||
| function startCrafting(player, hand, quest, startDur, startQly, startHQ) | ||||
|      | ||||
|     local worldMaster = GetWorldMaster(); | ||||
|     local proggers = 0; | ||||
|     local attempts = 5; | ||||
|     local craftedCount = 0; | ||||
|     local craftTotal = 2; | ||||
|     local itemId = 10009617; | ||||
|      | ||||
|     player:ChangeState(30+hand);  -- Craft kneeling w/ appropriate tool out | ||||
|     player:ChangeMusic(73); | ||||
|     callClientFunction(player, "delegateCommand", craftJudge, "openCraftProgressWidget", commandactor, startDur, startQly, startHQ);  | ||||
|  | ||||
|     while true do  | ||||
|      | ||||
|         local progDiff = math.random(25,25); | ||||
|         local duraDiff = math.random(1,3); | ||||
|         local qltyDiff = math.random(0,2); | ||||
|  | ||||
|         if proggers >= 100 then | ||||
|          | ||||
|             testChoice2 = callClientFunction(player, "delegateCommand", craftJudge, "updateInfo", commandactor,  100, 10, 20, 5020111, 69, 70, 75); | ||||
|  | ||||
|             testChoice = callClientFunction(player, "delegateCommand", craftJudge, "craftTuningUI", commandactor, 22503, 23033); | ||||
|              | ||||
|             player:SendGameMessage(GetWorldMaster(), 40111, 0x20, player, itemId, 3, 8);  -- "You create <#3 quantity> <#1 item> <#2 quality>." | ||||
|             callClientFunction(player, "delegateCommand", craftJudge, "closeCraftProgressWidget", commandactor); | ||||
|              | ||||
|             if quest then | ||||
|                 continueLeve = callClientFunction(player, "delegateCommand", craftJudge, "askContinueLocalLeve", 120001, itemId, craftedCount, craftTotal, attempts); | ||||
|  | ||||
|                 if continueLeve == true then | ||||
|                     proggers = 0; | ||||
|                     callClientFunction(player, "delegateCommand", craftJudge, "openCraftProgressWidget", commandactor, startDur, startQly, startHQ); | ||||
|                 else | ||||
|                     break; | ||||
|                 end | ||||
|             else | ||||
|                 break; | ||||
|             end | ||||
|         end | ||||
|          | ||||
|         choice = callClientFunction(player, "delegateCommand", craftJudge, "craftCommandUI", commandactor, 29, 2, 29530,29531,29532,29533,29534); | ||||
|         --player:SendMessage(0x20, "", "[DEBUG] Command id selected: "..choice); | ||||
|          | ||||
|  | ||||
|          | ||||
|         if choice then | ||||
|              | ||||
|             if skillAnim[choice] then | ||||
|                 player:PlayAnimation(skillAnim[choice]); | ||||
|             end | ||||
|              | ||||
|             wait(3); | ||||
|  | ||||
|             player:SendGameMessage(worldMaster, 40108, 0x20, choice,2); | ||||
|              | ||||
|             if choice ~= 29531 then | ||||
|                 proggers = proggers + progDiff; | ||||
|                  | ||||
|                 if proggers >= 100 then  | ||||
|                     proggers = 100; | ||||
|                 end | ||||
|                  | ||||
|                 startDur = startDur - duraDiff; | ||||
|                 startQly = startQly + qltyDiff; | ||||
|             | ||||
|                 player:SendGameMessage(worldMaster, 40102, 0x20, progDiff); | ||||
|                 player:SendGameMessage(worldMaster, 40103, 0x20, duraDiff); | ||||
|                 player:SendGameMessage(worldMaster, 40104, 0x20, qltyDiff); | ||||
|             end | ||||
|                                                                                                           --prg  dur  qly, ???, ???, ???,   HQ | ||||
|             callClientFunction(player, "delegateCommand", craftJudge, "updateInfo", commandactor, proggers, startDur, startQly, nil, nil, nil, nil, nil); | ||||
|              | ||||
|         end | ||||
|     end | ||||
|  | ||||
|     return -1;  | ||||
| end | ||||
|  | ||||
|  | ||||
| @@ -6,51 +6,406 @@ Operates the harvesting system for mining, logging, and fishing. | ||||
|  | ||||
| Functions: | ||||
|  | ||||
| loadTextData(commandActor): Loads all gamesheets needed and instantiates a HarvestJudge. | ||||
| targetCancel(commandActor): Cancels the player's target. | ||||
| turnToTarget(commandActor, harvestType, direction): Turns to a direction (name's a lie, angle must be computed lol) | ||||
| openInputWidget(commandActor, harvestType, nodeGrade): Inits the widget system (call first). | ||||
| orderInputWidget(commandActor, nodeHP [max 100], ?, harvestType): Updates the node HP. | ||||
| textInputWidget(commandActor, harvestType, ?, textId, ?, ?, ?): Sets the result text after a minigame is performed. | ||||
| askInputWidget(commandActor, harvestType, inputPageNumber, showTutorial, showFishWait, showFishWaitAndJig, updateFishHP, showRareCatalystEffect): Gets user input after opening a ask widget. | ||||
| closeInputWidget(commandActor, harvestType): Closes the widget system (call last). | ||||
| rangeInputWidget(harvestType, inputPageNumber, goodMin, goodMax, bool): Unknown, currently crashing... | ||||
| loadTextData() | ||||
|     Desc: Loads all gamesheets needed and instantiates a HarvestJudge. | ||||
| 	Params: None | ||||
|          | ||||
| targetCancel() | ||||
|     Desc: Cancels the player's target. | ||||
|     Params: None | ||||
|      | ||||
| turnToTarget() | ||||
|     Desc: Turns to a direction | ||||
|     Params: * harvestType           - Harvest command used.  Client script has a _waitForTurning() for Quarry/Harvest/Spearfishing | ||||
|             * direction             - The pi radian to turn the character towards, server has to calculate the vector between the actors. | ||||
|      | ||||
| openInputWidget() | ||||
|     Desc: Inits the widget system (call first). | ||||
|     Params: * harvestType           - Determines which text strings to load based on the harvestType | ||||
|             * nodeGrade             - The grade of the node.  Retail went up to grade 5. | ||||
|  | ||||
| orderInputWidget() | ||||
|     Desc: Updates the node HP. | ||||
|     Params: * nodeRemainder         - Range goes from 0-100 | ||||
|             * unk1                  - | ||||
|             * harvestType           - Doesn't appear to visually do anything? Script checks against harvest command id | ||||
|      | ||||
| textInputWidget() | ||||
|     Desc: Sets the result text after a minigame is performed. | ||||
|     Params: * harvestType           - The harvest command | ||||
|             * unk1                  - Actor to grab text from?  Set to the harvestJudge so the rest of params function, otherwise widget prints whatever is set here. | ||||
|             * textId                - Id from the harvestJudge sheet. | ||||
|             * textIdParam1          - Used to fill in textId details if the sheet requires it, Eg. textId #25 requires an itemId, HQ quality, and yield filled in. | ||||
|             * textIdParam2           | ||||
|             * textIdParam3           | ||||
|             * commandId             - If textId = nil, client script sets it to 64 and this parameter is assigned to Param1 | ||||
|                                     - Why does this exist?  Setting textId to 64 and using commandId as textIdParam1 does the same job. | ||||
|              | ||||
| askInputWidget() | ||||
|     Desc: Gets user input after opening a ask widget.  Returns two values, one being the id of the chosen command, and the "currentPower" of the minigame. | ||||
|     Params: * harvestType           - The harvest command | ||||
|             * phase                 - The current minigame window to show.  Valid ids 1 & 2. | ||||
|             * showTutorial          - Shows Tutorial menu option in the window if not = 0. | ||||
|             * showFishWait          - | ||||
|             * showFishWaitAndJig    - | ||||
|             * updateFishHP          - | ||||
|             * showRareCatalystEffect- | ||||
|   | ||||
| closeInputWidget() | ||||
|     Desc: Closes the widget system (call last). | ||||
|     Params: * harvestType           - The harvest command | ||||
|  | ||||
| rangeInputWidget() | ||||
|     Desc: Unknown, currently errors the client... | ||||
|     Params: * harvestType | ||||
|             * phase  | ||||
|             * goodMin | ||||
|             * goodMax | ||||
|             * bool  | ||||
|              | ||||
|              | ||||
| Notes: | ||||
|  | ||||
| HarvestType Ids: | ||||
|  | ||||
| 20002: Mine | ||||
| 20003: Log | ||||
| 20004: Fish | ||||
|  | ||||
|             * Aim = Where on the aim gauge the player chose. | ||||
|             * Remainder = How many attempts you get on the section portion of the minigame | ||||
|             * Sweetspot = Where you hit on the second portion of the minigame | ||||
| --]] | ||||
|  | ||||
| minerAnim = {0x14001000, 0x14002000, 0x14003000}; | ||||
|  | ||||
| --[[ Mooglebox - Aim | ||||
| +5  +4  +3  +2  +1   0  -1  -2  -3  -4   -5 | ||||
|  0  10  20  30  40  50  60  70  80  90  100 | ||||
|  | ||||
| Sweetspots   1=10  2=30  3=70  4=100 for Mining | ||||
| Remainder    A=40  B=60  C=70  D=80 | ||||
| --]] | ||||
|  | ||||
|  | ||||
| harvestNodeContainer = { -- nodeGrade, harvestAttempts, #ofItemsBecauseICantIntoIpairs, Item1, Item2, etc | ||||
|     [1001] = {2, 2, 3, 1, 2, 3}, | ||||
|     [1002] = {2, 4, 5, 3005, 3003, 3002, 3001, 3004} | ||||
| } | ||||
|  | ||||
| harvestNodeItems = {  | ||||
|         --itemId, remainder, aim, sweetspot, max yield | ||||
|     [1] = {10009104, 70, 30, 30, 4}, -- Rock Salt | ||||
|     [2] = {10006001, 80, 10, 30, 4}, -- Bone Chip | ||||
|     [3] = {10001006, 80, 20, 30, 3},  -- Copper Ore | ||||
|     [3001] = {10001003, 80, 50, 30, 3}, | ||||
|     [3002] = {10001006, 70, 70, 10, 4}, | ||||
|     [3003] = {10001005, 80, 90, 70, 1}, | ||||
|     [3004] = {10009104, 40, 10, 100, 2}, | ||||
|     [3005] = {10001007, 40,  0, 30, 1} | ||||
|     | ||||
| } | ||||
|  | ||||
|  | ||||
| require ("global") | ||||
|  | ||||
| function onEventStarted(player, commandactor, triggerName, arg1, arg2, arg3, arg4, checkedActorId) | ||||
| function onEventStarted(player, commandActor, triggerName, arg1, arg2, arg3, arg4, checkedActorId) | ||||
|  | ||||
| 	harvestJudge = GetStaticActor("HarvestJudge"); | ||||
| 	callClientFunction(player, "delegateCommand", harvestJudge, "loadTextData", commandactor); | ||||
| 	callClientFunction(player, "delegateCommand", harvestJudge, "targetCancel", commandactor); | ||||
| 	callClientFunction(player, "delegateCommand", harvestJudge, "turnToTarget", commandactor, 0x55F2, 2); | ||||
|     debugMsg = false; | ||||
|      | ||||
|     powerCurrent = 0; | ||||
|     powerLast = 0; | ||||
|     powerRange = 10;    -- 'Feels' look a good amount compared to vids/ARR's minigame. | ||||
|      | ||||
|     showTutorial = 0; | ||||
|      | ||||
|     commandMine = 22002; | ||||
|     commandLog = 22003; | ||||
|     commandFish = 22004; | ||||
|  | ||||
|     harvestNodeId = 1001; -- What the server should send eventually | ||||
|     harvestNode = BuildHarvestNode(player, harvestNodeId);  -- [1-11] = {itemId, remainder, sweetspot, maxYield} | ||||
|     harvestGrade = harvestNodeContainer[harvestNodeId][1] or 0; | ||||
|     harvestAttempts = harvestNodeContainer[harvestNodeId][2] or 0; | ||||
|     nodeRemainder = 0; | ||||
|  | ||||
|         | ||||
|      | ||||
|     harvestType = commandMine; | ||||
|      | ||||
|     worldMaster = GetWorldMaster(); | ||||
|     harvestJudge = GetStaticActor("HarvestJudge"); | ||||
|     callClientFunction(player, "delegateCommand", harvestJudge, "loadTextData", commandActor); | ||||
|     --callClientFunction(player, "delegateCommand", harvestJudge, "targetCancel", commandActor); | ||||
|     --callClientFunction(player, "delegateCommand", harvestJudge, "turnToTarget", commandActor, harvestType, nodeGrade); | ||||
|  | ||||
|     player:ChangeState(50); | ||||
| 	 | ||||
| 	player:ChangeState(50); | ||||
| 	 | ||||
| 	callClientFunction(player, "delegateCommand", harvestJudge, "openInputWidget", commandactor, 0x55F2, 2); | ||||
| 	callClientFunction(player, "delegateCommand", harvestJudge, "orderInputWidget", commandactor, 3, false, 0x55f2); | ||||
| 	callClientFunction(player, "delegateCommand", harvestJudge, "textInputWidget", commandactor, 0x55f2, harvestJudge, nil, nil, nil, nil, 0); | ||||
| 	callClientFunction(player, "delegateCommand", harvestJudge, "askInputWidget", commandactor, 0x55f2, 1, 0, false, false, nil, false); | ||||
| 	 | ||||
| 	callClientFunction(player, "delegateCommand", harvestJudge, "textInputWidget", commandactor, 0x55f2, harvestJudge, 60, nil, nil, nil, 0); | ||||
| 	callClientFunction(player, "delegateCommand", harvestJudge, "askInputWidget", commandactor, 0x55f2, 2, 0, false, false, nil, false); | ||||
| 	 | ||||
| 	callClientFunction(player, "delegateCommand", harvestJudge, "textInputWidget", commandactor, 0x55f2, harvestJudge, 46,0, 0, 0, 0); | ||||
| 	callClientFunction(player, "delegateCommand", harvestJudge, "askInputWidget", commandactor, 0x55f2, 2, 0, false, false, nil, false); | ||||
| 	 | ||||
| 	 | ||||
| 	player:ChangeState(0); | ||||
|  | ||||
|      | ||||
|     if harvestType == commandMine then | ||||
|         player:SendGameMessage(harvestJudge, 26, MESSAGE_TYPE_SYSTEM, 1, harvestGrade); | ||||
|          | ||||
|         callClientFunction(player, "delegateCommand", harvestJudge, "openInputWidget", commandActor, harvestType, harvestGrade); | ||||
|         callClientFunction(player, "delegateCommand", harvestJudge, "orderInputWidget", commandActor, nodeRemainder, nil, harvestType); | ||||
|         callClientFunction(player, "delegateCommand", harvestJudge, "textInputWidget", commandActor, harvestType, harvestJudge, nil, 0, 0, 0, 0); | ||||
|  | ||||
|          | ||||
|          | ||||
|         while harvestAttempts > 0 do | ||||
|          | ||||
|             -- "Aim", 0 = Top of bar, 100 = Bottom. | ||||
|             menuResult, sliderPhase, unk3 = callClientFunction(player, "delegateCommand", harvestJudge, "askInputWidget", commandActor, harvestType, 1, showTutorial, false, false, nil, false);  | ||||
|             if debugMsg then player:SendMessage(0x20, "", "menuResult: "..tostring(menuResult).." sliderPhase: "..tostring(sliderPhase).." Unk: "..tostring(unk3)); end | ||||
|          | ||||
|             if menuResult == 22701 then     -- Begin. | ||||
|  | ||||
|                 local aimSlot = (sliderPhase/10)+1; -- Thanks LUA index = 1 | ||||
|                  | ||||
|                 local nodeDetails = harvestNode[aimSlot]; | ||||
|                 local nodeItem = nodeDetails[1]; | ||||
|                 local nodeRemainder = nodeDetails[2]; | ||||
|                 local nodeSweetspot = nodeDetails[3]; | ||||
|                 local nodeYield = nodeDetails[4]; | ||||
|                 local isFirstSwing = true; | ||||
|                  | ||||
|                 local sweetspotDifference; | ||||
|                 local sweetspotDifferencePrevious; | ||||
|                  | ||||
|                 if debugMsg then  | ||||
|                     player:SendMessage(0x20, "", "aimSlot: "..(aimSlot).."   itemId:"..tostring(nodeDetails[1]).." remainder: "..tostring(nodeDetails[2])); | ||||
|                 end | ||||
|          | ||||
|                  | ||||
|                 player:SendGameMessage(harvestJudge, 36, MESSAGE_TYPE_SYSTEM); -- "You set your sights on an area." | ||||
|  | ||||
|  | ||||
|                  | ||||
|                 callClientFunction(player, "delegateCommand", harvestJudge, "orderInputWidget", commandActor, nodeRemainder, nil, harvestType); | ||||
|                  | ||||
|                 while true do | ||||
|                     callClientFunction(player, "delegateCommand", harvestJudge, "textInputWidget", commandActor, harvestType, harvestJudge, nil, 0, 0, 0, 0); | ||||
|                      | ||||
|                     -- "Strike" 0 = Empty, 100 = Filled.   Mooglebox sweespots are 1=10, 2=30, 3=70, 4=100 for Mining | ||||
|                     chosenCommand, powerCurrent = callClientFunction(player, "delegateCommand", harvestJudge, "askInputWidget", commandActor, harvestType, 2, showTutorial, false, false, nil, false); -- Strike | ||||
|      | ||||
|                     if debugMsg then player:SendMessage(0x20, "", tostring(chosenCommand).." Power: "..tostring(powerCurrent)); end | ||||
|                      | ||||
|                      | ||||
|                     if chosenCommand == 22702 then      -- Cancel. | ||||
|                         harvestAttempts = harvestAttempts - 1; | ||||
|                          | ||||
|                         if harvestAttempts > 0 then | ||||
|                             -- You can make # more gathering attempts. | ||||
|                             player:SendGameMessage(player, worldMaster, 40344, 0x20, harvestAttempts); | ||||
|                         else | ||||
|                             -- There is nothing left to gather at this location. | ||||
|                             player:SendGameMessage(player, worldMaster, 40339, 0x20, harvestAttempts); | ||||
|                         end | ||||
|                         break; | ||||
|                          | ||||
|                     elseif chosenCommand == 22703 then  -- Strike. | ||||
|                          | ||||
|                          | ||||
|                         nodeRemainder = nodeRemainder - 20; | ||||
|                         if nodeRemainder < 0 then  | ||||
|                             nodeRemainder = 0;   | ||||
|                         end | ||||
|                          | ||||
|                         callClientFunction(player, "delegateCommand", harvestJudge, "textInputWidget", commandActor, harvestType, harvestJudge, nil, 0, 0, 0, 0); | ||||
|                          | ||||
|                         player:PlayAnimation(minerAnim[math.random(1,3)]); | ||||
|                         wait(2); | ||||
|                         sweetspotDifference = math.abs(powerCurrent - nodeSweetspot); | ||||
|                          | ||||
|                          | ||||
|                         if powerRange >= sweetspotDifference then | ||||
|                             callClientFunction(player, "delegateCommand", harvestJudge, "orderInputWidget", commandActor, nodeRemainder, false, harvestType); | ||||
|                              | ||||
|                             -- "You obtain <yield> <item> <quality>" | ||||
|                             callClientFunction(player, "delegateCommand", harvestJudge, "textInputWidget", commandActor, harvestType, harvestJudge, 25, nodeItem, 0, nodeYield, 0); | ||||
|                              | ||||
|                             player:SendGameMessage(player, worldMaster, 40301, MESSAGE_TYPE_SYSTEM, player, nodeItem, nodeYield); -- TODO: Refer to caps to see wtf is going on here | ||||
|                              | ||||
|                              | ||||
|                             HarvestReward(player, nodeItem, nodeYield); | ||||
|                             nodeRemainder = 0; | ||||
|                         else | ||||
|                             if isFirstSwing then | ||||
|                                 if sweetspotDifference < 19 then  -- TODO: TWEAK THESE, likely need to be larger | ||||
|                                     callClientFunction(player, "delegateCommand", harvestJudge, "textInputWidget", commandActor, harvestType, harvestJudge, 45); | ||||
|                                     player:SendGameMessage(harvestJudge, 45, MESSAGE_TYPE_SYSTEM); -- "You feel something promising." | ||||
|                                 elseif sweetspotDifference > 20 then | ||||
|                                     callClientFunction(player, "delegateCommand", harvestJudge, "textInputWidget", commandActor, harvestType, harvestJudge, 42); | ||||
|                                     player:SendGameMessage(harvestJudge, 42, MESSAGE_TYPE_SYSTEM); -- "You feel nothing promising." | ||||
|                                 end | ||||
|                             else | ||||
|                                 if sweetspotDifference > sweetspotDifferencePrevious then | ||||
|                                     callClientFunction(player, "delegateCommand", harvestJudge, "textInputWidget", commandActor, harvestType, harvestJudge, 43); | ||||
|                                     player:SendGameMessage(harvestJudge, 43, MESSAGE_TYPE_SYSTEM); -- "You are getting farther from the mark." | ||||
|                           | ||||
|                                 elseif  sweetspotDifference < sweetspotDifferencePrevious then | ||||
|                                     callClientFunction(player, "delegateCommand", harvestJudge, "textInputWidget", commandActor, harvestType, harvestJudge, 44); | ||||
|                                     player:SendGameMessage(harvestJudge, 44, MESSAGE_TYPE_SYSTEM); -- "You are getting closer to the mark."    | ||||
|                                 else | ||||
|                                     callClientFunction(player, "delegateCommand", harvestJudge, "textInputWidget", commandActor, harvestType, harvestJudge, 42); | ||||
|                                     player:SendGameMessage(harvestJudge, 42, MESSAGE_TYPE_SYSTEM); -- "You feel nothing promising."   | ||||
|                                 end | ||||
|                             end        | ||||
|                         end | ||||
|                          | ||||
|                         if not isFirstSwing then | ||||
|                             powerLast = powerCurrent; | ||||
|                         end; | ||||
|  | ||||
|                         callClientFunction(player, "delegateCommand", harvestJudge, "orderInputWidget", commandActor, nodeRemainder, false, harvestType); | ||||
|                          | ||||
|  | ||||
|                         if nodeRemainder == 0 then | ||||
|                             harvestAttempts = harvestAttempts - 1; | ||||
|                              | ||||
|                             if harvestAttempts > 0 then | ||||
|                                 -- You can make # more gathering attempts. | ||||
|                                 player:SendGameMessage(player, worldMaster, 40344, 0x20, harvestAttempts); | ||||
|                             else | ||||
|                                 -- There is nothing left to gather at this location. | ||||
|                                 player:ChangeMusic(101); | ||||
|                                 player:SendGameMessage(player, worldMaster, 40339, 0x20, harvestAttempts); | ||||
|                             end   | ||||
|                          | ||||
|                             wait(2); | ||||
|                             break; | ||||
|                         end | ||||
|                          | ||||
|                          | ||||
|                         if isFirstSwing and debugMsg then player:SendMessage(0x20, "", "First swing"); end | ||||
|                          | ||||
|                         isFirstSwing = false; | ||||
|                         sweetspotDifferencePrevious = sweetspotDifference;  | ||||
|                          | ||||
|                     elseif chosenCommand == 22710 then -- "Strike" Tutorial.                     | ||||
|                         SendTutorial(player, harvestJudge, 2); | ||||
|                     end | ||||
|                      | ||||
|                 end | ||||
|                  | ||||
|             elseif menuResult == 22702 then -- Cancel. | ||||
|                 break; | ||||
|             elseif menuResult == 22710 then -- "Aim" Tutorial. | ||||
|                 SendTutorial(player, harvestJudge, 1); | ||||
|             end | ||||
|         end | ||||
|          | ||||
|     elseif harvestType == commandLog then | ||||
|      | ||||
|     elseif harvestType == commandFish then | ||||
|      | ||||
|     end | ||||
|      | ||||
|     player:SendGameMessage(harvestJudge, 31, MESSAGE_TYPE_SYSTEM); | ||||
|      | ||||
|      | ||||
|     if harvestAttempts == 0 then | ||||
|         player:SendGameMessage(player, worldMaster, 40310, 0x20); -- "The deposit has been exhausted." | ||||
|         --TO:DO Despawn node + whatever logic to respawn an exsiting expired node in the area. | ||||
|     end | ||||
|       | ||||
| 	callClientFunction(player, "delegateCommand", harvestJudge, "closeInputWidget", commandActor, harvestType); | ||||
|      | ||||
| 	 | ||||
|     player:ChangeState(0); | ||||
| 	player:EndEvent(); | ||||
| 	 | ||||
| end | ||||
|  | ||||
|  | ||||
|  | ||||
| -- Returns a table in the following format:  nodeTable = { [1-11] = {itemId, remainder, sweetspot, maxYield} } | ||||
| function BuildHarvestNode(player, sentNode) | ||||
|  | ||||
|     if harvestNodeContainer[sentNode] then | ||||
|         local node = harvestNodeContainer[sentNode]; | ||||
|         local nodeTable = {}; | ||||
|         local nodeItems = {}; | ||||
|         local nodeItemCount = node[3]; | ||||
|          | ||||
|         local grade = node[1]; | ||||
|         local attempts = node[2]; | ||||
|          | ||||
|     | ||||
|         -- Load up nodeItems[] with the harvestNodeItems{} key and Aim point | ||||
|         for i=1, nodeItemCount do | ||||
|             local nodeItemKey = node[3+i]; | ||||
|             local item = harvestNodeItems[ node[3+i] ] | ||||
|              | ||||
|             nodeItems[i] = { nodeItemKey, ((item[3] / 10)+1) }; | ||||
|              | ||||
|             if debugMsg then  player:SendMessage(0x20, "", "nodeItems: "..nodeItems[i][1].." "..nodeItems[i][2]); end | ||||
|         end | ||||
|      | ||||
|         -- Iterate through the 11 Aim spots | ||||
|         for i=1,11,1 do  | ||||
|             local hasItem = false; | ||||
|              | ||||
|             -- See if there's a nodeItems[] that has an Aim spot that matches the current loop | ||||
|             -- TODO: Just set nodeItems[] keys to the actual slots to skip this loop inside a loop | ||||
|             for j=1, nodeItemCount do | ||||
|                 if nodeItems[j][2] == i then | ||||
|                     hasItem = j; | ||||
|                     break; | ||||
|                 end | ||||
|             end | ||||
|           | ||||
|             if hasItem then | ||||
|                 local item = harvestNodeItems[ nodeItems[hasItem][1] ]; | ||||
|                  | ||||
|                 -- Assign itemId, remainder, sweetspot, yield to this slot | ||||
|                 nodeTable[i] = {item[1], item[2], item[4], item[5] }; | ||||
|                  | ||||
|                 if debugMsg then  | ||||
|                     player:SendMessage(0x20, "", "nodeTable: "..i.." "..nodeTable[i][1].." "..nodeTable[i][2].." "..nodeTable[i][3].." "..nodeTable[i][3]);  | ||||
|                 end | ||||
|                  | ||||
|             else | ||||
|                 nodeTable[i] = {0,0,0,0}; | ||||
|                 if debugMsg then player:SendMessage(0x20, "", "nodeTable: "..i); end | ||||
|             end                         | ||||
|         end | ||||
|          | ||||
|         return nodeTable | ||||
|     end | ||||
|      | ||||
| end | ||||
|  | ||||
|  | ||||
|  | ||||
| function SendTutorial(player, harvestJudge, id) | ||||
|      | ||||
|     if id == 1 then | ||||
|         player:SendGameMessage(harvestJudge, 1, MESSAGE_TYPE_SYSTEM); | ||||
|         wait(3); | ||||
|         player:SendGameMessage(harvestJudge, 4, MESSAGE_TYPE_SYSTEM); | ||||
|     elseif id == 2 then | ||||
|         player:SendGameMessage(harvestJudge, 7, MESSAGE_TYPE_SYSTEM); | ||||
|         wait(3); | ||||
|         player:SendGameMessage(harvestJudge, 10, MESSAGE_TYPE_SYSTEM);                   | ||||
|         wait(3); | ||||
|         player:SendGameMessage(harvestJudge, 13, MESSAGE_TYPE_SYSTEM);  | ||||
|         wait(3); | ||||
|         player:SendGameMessage(harvestJudge, 16, MESSAGE_TYPE_SYSTEM);   | ||||
|     end | ||||
|  | ||||
| end | ||||
|  | ||||
| function HarvestReward(player, item, qty)  -- Really should get a helper function for this | ||||
|  | ||||
|     local worldMaster = GetWorldMaster(); | ||||
|     local location = INVENTORY_NORMAL; | ||||
|     local invCheck = player:getItemPackage(location):addItem(item, qty, 1);        | ||||
|      | ||||
|     if (invCheck == INV_ERROR_FULL) then | ||||
|         -- Your inventory is full. | ||||
|         player:SendGameMessage(player, worldMaster, 60022, MESSAGE_TYPE_SYSTEM_ERROR); | ||||
|     elseif (invCheck == INV_ERROR_ALREADY_HAS_UNIQUE) then | ||||
|         -- You cannot have more than one <itemId> <quality> in your possession at any given time. | ||||
|         player:SendGameMessage(player, worldMaster, 40279, MESSAGE_TYPE_SYSTEM_ERROR, item, 1); | ||||
|     elseif (invCheck == INV_ERROR_SYSTEM_ERROR) then | ||||
|         player:SendMessage(MESSAGE_TYPE_SYSTEM_ERROR, "", "[DEBUG] Server Error on adding item."); | ||||
|     elseif (invCheck == INV_ERROR_SUCCESS) then | ||||
|         --player:SendMessage(MESSAGE_TYPE_SYSTEM, "", message); | ||||
|         player:SendGameMessage(player, worldMaster, 25246, MESSAGE_TYPE_SYSTEM, item, qty); | ||||
|     end | ||||
| end | ||||
| @@ -1,6 +0,0 @@ | ||||
|  | ||||
| shopInfo = { | ||||
| welcomeText = 94, | ||||
| shopPack = 0x67, | ||||
| shopCurrancy = nil | ||||
| } | ||||
| @@ -1,6 +0,0 @@ | ||||
|  | ||||
| shopInfo = { | ||||
| welcomeText = 69, | ||||
| shopPack = 3020, | ||||
| tutorialId = 35 | ||||
| } | ||||
| @@ -1,6 +0,0 @@ | ||||
|  | ||||
| shopInfo = { | ||||
| welcomeText = 64, | ||||
| shopPack = 3021, | ||||
| tutorialId = 34 | ||||
| } | ||||
| @@ -1,6 +0,0 @@ | ||||
|  | ||||
| shopInfo = { | ||||
| welcomeText = 76, | ||||
| shopPack = 3022, | ||||
| tutorialId = 39 | ||||
| } | ||||
| @@ -1,6 +0,0 @@ | ||||
|  | ||||
| shopInfo = { | ||||
| welcomeText = 54, | ||||
| shopPack = 3019, | ||||
| tutorialId = 32 | ||||
| } | ||||
| @@ -1,5 +0,0 @@ | ||||
|  | ||||
| shopInfo = { | ||||
| welcomeText = 265, | ||||
| shopPack = 3024	 | ||||
| } | ||||
| @@ -1,5 +0,0 @@ | ||||
|  | ||||
| shopInfo = { | ||||
| welcomeText = 111, | ||||
| shopPack = 3003 | ||||
| } | ||||
| @@ -1,5 +0,0 @@ | ||||
|  | ||||
| shopInfo = { | ||||
| welcomeText = 110, | ||||
| shopPack = 3002	 | ||||
| } | ||||
		Reference in New Issue
	
	Block a user