Last active
April 25, 2020 17:21
-
-
Save RestoreMonarchy/ec391cf4f8e2c7647bdb50c3b80dfadb to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using RestoreMonarchy.ChallengeRewards.Database; | |
using RestoreMonarchy.ChallengeRewards.Models; | |
using Rocket.Unturned.Player; | |
using SDG.Unturned; | |
using Steamworks; | |
using System.Collections.Generic; | |
using System.Linq; | |
using System.Threading; | |
using UnityEngine; | |
namespace RestoreMonarchy.ChallengeRewards.Components | |
{ | |
public class ChallengesUIComponent : MonoBehaviour | |
{ | |
private ChallengeRewardsPlugin pluginInstance => ChallengeRewardsPlugin.Instance; | |
public Player Player { get; private set; } | |
public const int Key = 2534; | |
private CSteamID CSteamID => Player.channel.owner.playerID.steamID; | |
public List<Challenge> Challenges => pluginInstance.ChallengesService.Challenges[CSteamID.ToString()]; | |
private List<ChallengeQuest> displayedQuests; | |
private int currentPage = 0; | |
private Challenge currentChallenge; | |
private int currentMaxPages; | |
private static readonly string[] nums = new string[] { "first", "second", "third" }; | |
void Awake() | |
{ | |
Player = GetComponent<Player>(); | |
// Send Effect | |
EffectManager.sendUIEffect(pluginInstance.Configuration.Instance.EffectId, Key, CSteamID, false); | |
Player.enablePluginWidgetFlag(EPluginWidgetFlags.Modal); | |
Player.enablePluginWidgetFlag(EPluginWidgetFlags.ForceBlur); | |
EffectManager.sendUIEffectText(Key, CSteamID, false, "chl_header", pluginInstance.Translate("UI_Header")); | |
EffectManager.sendUIEffectText(Key, CSteamID, false, "chl_daily_text", | |
pluginInstance.Configuration.Instance.Challenges.FirstOrDefault(x => x.ChallengeName == "daily")?.ChallengePublicName ?? "Daily"); | |
EffectManager.sendUIEffectText(Key, CSteamID, false, "chl_weekly_text", | |
pluginInstance.Configuration.Instance.Challenges.FirstOrDefault(x => x.ChallengeName == "weekly")?.ChallengePublicName ?? "Weekly"); | |
EffectManager.sendUIEffectText(Key, CSteamID, false, "chl_monthly_text", | |
pluginInstance.Configuration.Instance.Challenges.FirstOrDefault(x => x.ChallengeName == "monthly")?.ChallengePublicName ?? "Monthly"); | |
EffectManager.sendUIEffectText(Key, CSteamID, false, "chl_close_text", pluginInstance.Translate("UI_Close")); | |
EffectManager.sendUIEffectText(Key, CSteamID, false, "chl_next_text", pluginInstance.Translate("UI_Next")); | |
EffectManager.sendUIEffectText(Key, CSteamID, false, "chl_prev_text", pluginInstance.Translate("UI_Prev")); | |
ChangeCurrentChallenge(Challenges.FirstOrDefault(x => x.Name == "daily")); | |
} | |
public void OnButtonClicked(string buttonName) | |
{ | |
switch (buttonName) | |
{ | |
case "chl_daily_button": | |
ChangeCurrentChallenge(Challenges.FirstOrDefault(x => x.Name == "daily")); | |
break; | |
case "chl_weekly_button": | |
ChangeCurrentChallenge(Challenges.FirstOrDefault(x => x.Name == "weekly")); | |
break; | |
case "chl_monthly_button": | |
ChangeCurrentChallenge(Challenges.FirstOrDefault(x => x.Name == "monthly")); | |
break; | |
case "chl_first_cl": | |
ClaimQuest(displayedQuests[0]); | |
break; | |
case "chl_second_cl": | |
ClaimQuest(displayedQuests[1]); | |
break; | |
case "chl_third_cl": | |
ClaimQuest(displayedQuests[2]); | |
break; | |
case "chl_prev_button": | |
PrevPage(); | |
break; | |
case "chl_next_button": | |
NextPage(); | |
break; | |
case "chl_close_button": | |
Destroy(this); | |
break; | |
} | |
} | |
private void NextPage() | |
{ | |
if (currentPage + 1 == currentMaxPages) | |
return; | |
currentPage++; | |
UpdateQuestsPage(); | |
} | |
private void PrevPage() | |
{ | |
if (currentPage <= 0) | |
return; | |
currentPage--; | |
UpdateQuestsPage(); | |
} | |
private void ClaimQuest(ChallengeQuest quest) | |
{ | |
if (quest.Completed && !quest.Claimed) | |
{ | |
pluginInstance.GiveReward(UnturnedPlayer.FromCSteamID(CSteamID), quest.Reward); | |
quest.Claimed = true; | |
ThreadPool.QueueUserWorkItem((a) => pluginInstance.DatabaseManager.MarkQuestClaimed(quest.Id)); | |
UpdateQuestsPage(); | |
} | |
} | |
private void ChangeCurrentChallenge(Challenge challenge) | |
{ | |
if (challenge == null) | |
return; | |
currentChallenge = challenge; | |
currentPage = 0; | |
currentMaxPages = challenge.Quests.Count / 3 + (challenge.Quests.Count % 3 == 0 ? 0 : 1); | |
EffectManager.sendUIEffectText(Key, CSteamID, false, "chl_current", | |
pluginInstance.Configuration.Instance.Challenges.FirstOrDefault(x => x.ChallengeName == challenge.Name)?.ChallengePublicName ?? string.Empty); | |
UpdateQuestsPage(); | |
} | |
private void UpdateQuestsPage() | |
{ | |
displayedQuests = currentChallenge.Quests.Skip(currentPage * 3).Take(3).ToList(); | |
for (int i = 0; i < 3; i++) | |
{ | |
var quest = displayedQuests.ElementAtOrDefault(i); | |
if (quest == null) | |
{ | |
EffectManager.sendUIEffectText(Key, CSteamID, false, $"chl_{nums[i]}_text", string.Empty); | |
EffectManager.sendUIEffectText(Key, CSteamID, false, $"chl_{nums[i]}_pr", string.Empty); | |
EffectManager.sendUIEffectText(Key, CSteamID, false, $"chl_{nums[i]}_cl", string.Empty); | |
continue; | |
} | |
EffectManager.sendUIEffectText(Key, CSteamID, false, $"chl_{nums[i]}_text", GetQuestText(quest)); | |
EffectManager.sendUIEffectText(Key, CSteamID, false, $"chl_{nums[i]}_pr", quest.Completed ? pluginInstance.Translate("UI_QuestCompleted") : | |
pluginInstance.Translate("UI_QuestProgress", quest.Amount, quest.Target)); | |
EffectManager.sendUIEffectText(Key, CSteamID, false, $"chl_{nums[i]}_cl", quest.Completed && !quest.Claimed ? | |
pluginInstance.Translate("UI_QuestClaim") : string.Empty); | |
} | |
EffectManager.sendUIEffectText(Key, CSteamID, false, "chl_page", pluginInstance.Translate("UI_Page", currentPage + 1, currentMaxPages)); | |
} | |
private string GetQuestText(ChallengeQuest quest) | |
{ | |
string msg = pluginInstance.Translate(quest.QuestType.ToUpper()); | |
string reward = string.Empty; | |
string digits = new string(quest.Reward.Where(c => char.IsDigit(c) || c == '.').ToArray()); | |
if (quest.Reward.ToLower().Contains("experience")) | |
{ | |
reward = pluginInstance.Translate("ExperienceReward", digits); | |
} | |
else if (quest.Reward.ToLower().Contains("money")) | |
{ | |
reward = pluginInstance.Translate("MoneyReward", digits); | |
} | |
else if (quest.Reward.ToLower().Contains("item")) | |
{ | |
var asset = Assets.find(EAssetType.ITEM, ushort.Parse(digits)) as ItemAsset; | |
if (asset != null) | |
reward = pluginInstance.Translate("ItemReward", asset.itemName); | |
} | |
else if (quest.Reward.ToLower().Contains("vehicle")) | |
{ | |
var asset = Assets.find(EAssetType.VEHICLE, ushort.Parse(digits)) as VehicleAsset; | |
if (asset != null) | |
reward = pluginInstance.Translate("VehicleReward", asset.vehicleName); | |
} | |
msg += "\n" + reward; | |
return msg; | |
} | |
void OnDestroy() | |
{ | |
Player.disablePluginWidgetFlag(EPluginWidgetFlags.Modal); | |
Player.disablePluginWidgetFlag(EPluginWidgetFlags.ForceBlur); | |
EffectManager.askEffectClearByID(pluginInstance.Configuration.Instance.EffectId, CSteamID); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment