Skip to content

Instantly share code, notes, and snippets.

@RestoreMonarchy
Last active April 25, 2020 17:21
Show Gist options
  • Save RestoreMonarchy/ec391cf4f8e2c7647bdb50c3b80dfadb to your computer and use it in GitHub Desktop.
Save RestoreMonarchy/ec391cf4f8e2c7647bdb50c3b80dfadb to your computer and use it in GitHub Desktop.
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