Name | Type | is_array | initial_value |
AITempGroup | group | No | |
AITempPosition | location | No | |
AITempUnit | unit | No | |
AIValidPlayerTargets | force | No | |
diff | integer | No | |
DiffDialog | dialog | No | |
Easy | button | No | |
Hard | button | No | |
NoClick | button | No | |
Normal | button | No | |
PingExplosiveZombie | group | No | |
Timer | timer | No | |
TimerWindow | timerdialog | No |
library CameraSlider initializer init
globals
private real max_dist = 5000
private real min_dist = 500
private real array current_dist
endglobals
private function periodic takes nothing returns nothing
local integer i = 0
loop
exitwhen i > bj_MAX_PLAYERS
if Player(i) == GetLocalPlayer() then
call SetCameraField(CAMERA_FIELD_TARGET_DISTANCE, current_dist[i], 0)
call SetCameraField(CAMERA_FIELD_FARZ, 1.5 * current_dist[i], 0)
endif
set i = i + 1
endloop
endfunction
private function chatCam takes nothing returns nothing
local real zoom = S2R(SubString(GetEventPlayerChatString(), 5, StringLength(GetEventPlayerChatString())))
local integer pid = GetPlayerId(GetTriggerPlayer())
if zoom < min_dist then
set zoom = min_dist
elseif zoom > max_dist then
set zoom = max_dist
endif
set current_dist[pid] = zoom
endfunction
private function sliderCam takes nothing returns nothing
local real zoom = BlzGetTriggerFrameValue()
local integer pid = GetPlayerId(GetTriggerPlayer())
set current_dist[pid] = zoom
endfunction
private function init takes nothing returns nothing
local integer i = 0
local trigger chatTrigger = CreateTrigger()
local trigger CameraControl = CreateTrigger()
local framehandle VSlider = BlzCreateFrameByType("SLIDER", "Distance", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0), "QuestMainListScrollBar", 0)
local framehandle SliderToolTip = BlzCreateFrameByType("TEXT", "SliderTitle", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0), "", 0)
local integer ColorMrGoblin = BlzConvertColor(255, 80, 80, 0) // Change values of alpha, red, green and blue for another custom color
call TimerStart(CreateTimer(), 0.1, true, function periodic) // change loop speed as desired.
call TriggerAddAction(chatTrigger, function chatCam)
loop
exitwhen i > bj_MAX_PLAYERS
call TriggerRegisterPlayerChatEvent(chatTrigger, Player(i), "-cam ", false)
set current_dist[i] = 2200 //default zoom
set i = i + 1
endloop
// Set parameter for the Slider
call BlzFrameSetSize(VSlider, 0.015, 0.085)
call BlzFrameSetAbsPoint(VSlider, FRAMEPOINT_BOTTOMLEFT, 0.2920, 0.022)
call BlzFrameSetMinMaxValue(VSlider, min_dist, max_dist)
call BlzFrameSetValue(VSlider, current_dist[0])
call BlzFrameSetStepSize(VSlider, 50)
// ... and for the SliderToolTip
call BlzFrameSetText(SliderToolTip, "") // Sets display text when hovered over the frame
call BlzFrameSetScale(SliderToolTip, 1.60)
call BlzFrameSetTextColor(SliderToolTip, ColorMrGoblin)
call BlzFrameSetAbsPoint(SliderToolTip, FRAMEPOINT_BOTTOMLEFT, 0.22, 0.16)
call BlzFrameSetTooltip(VSlider, SliderToolTip)
// Add event and callback to trigger for the Slider
call BlzTriggerRegisterFrameEvent(CameraControl, VSlider, FRAMEEVENT_SLIDER_VALUE_CHANGED)
call TriggerAddAction(CameraControl, function sliderCam)
set VSlider = null
set CameraControl = null
endfunction
endlibrary
library libColor initializer OnInit
private function UnHex takes string s, integer a, integer b returns integer
local string hex = "0123456789ABCDEF"
local string hex2 = "0123456789abcdef"
local integer i
local integer r = 0
local string c
loop
exitwhen a >= b
set c = SubString(s, a, a + 1)
set i = 0
loop
exitwhen i >= 16
exitwhen c == SubString(hex, i, i + 1)
exitwhen c == SubString(hex2, i, i + 1)
set i = i + 1
endloop
if i >= 16 then
set i = 0
endif
set r = r * 16 + i
set a = a + 1
endloop
return r
endfunction
struct Color
integer red
integer green
integer blue
string web
static method create takes string web returns Color
local Color c = Color.allocate()
set c.web = "|cff" + web
set c.red = UnHex(web, 0, 2)
set c.green = UnHex(web, 0, 4)
set c.blue = UnHex(web, 0, 6)
return c
endmethod
endstruct
globals
Color array colors
endglobals
private function OnInit takes nothing returns nothing
set colors [0] = Color.create("FF0303") // red
set colors [1] = Color.create("0042FF") // blue
set colors [2] = Color.create("1CE6B9") // teal
set colors [3] = Color.create("540081") // purple
set colors [4] = Color.create("FFFC00") // yellow
set colors [5] = Color.create("FE8A0E") // orange
set colors [6] = Color.create("20C000") // green
set colors [7] = Color.create("E55BB0") // pink
set colors [8] = Color.create("959697") // gray
set colors [9] = Color.create("7FBFF1") // lightblue
set colors[10] = Color.create("106246") // darkgreen
set colors[11] = Color.create("492A04") // brown
set colors[12] = Color.create("FFFFFF") // white
endfunction
endlibrary
//! zinc
library resourceSender {
private player r_player;
private integer r_amount;
private constant real TAX = 0.5;
private string COLOR_GRAY = "|cff444444";
private string COLOR_DARKGRAY = "|cff333333";
function GetPlayerNameColored (player p) -> string {
return colors[GetPlayerId(p)].web + GetPlayerName(p) + "|r";
}
function Trim(string s) -> string {
// Trim from start
while(StringLength(s) != 0) {
if (SubString(s, 0, 1) != " ") {
break;
}
s = SubString(s, 1, StringLength(s));
}
// Trim from end
while(StringLength(s) != 0) {
if (SubString(s, StringLength(s) - 1, StringLength(s)) != " ") {
break;
}
s = SubString(s, 0, StringLength(s) - 1);
}
return s;
}
function TriggerRegisterAnyPlayerChatEvent(trigger whichTrigger, string chatMessageToDetect, boolean exactMatchOnly) {
integer i = 0;
for(0 <= i <= bj_MAX_PLAYERS) {
TriggerRegisterPlayerChatEvent(whichTrigger, Player(i), chatMessageToDetect, exactMatchOnly);
}
}
function GetPlayerByName(string s) -> player {
integer i = 0;
integer j = 0;
string o;
s = StringCase(s, false);
if (s == "red" || s == "1") {
return Player(0);
}
else if (s == "blue" || s == "2") {
return Player(1);
}
else if (s == "teal" || s == "cyan" || s == "3") {
return Player(2);
}
else if (s == "purple" || s == "4") {
return Player(3);
}
else if (s == "yellow" || s == "5") {
return Player(4);
}
else if (s == "orange" || s == "6") {
return Player(5);
}
else if (s == "green" || s == "7") {
return Player(6);
}
else if (s == "pink" || s == "8") {
return Player(7);
}
else if (s == "gray" || s == "grey" || s == "9") {
return Player(8);
}
else if (s == "light blue" || s == "lightblue" || s == "lb" || s == "10") {
return Player(9);
}
else if (s == "dark green" || s == "darkgreen" || s == "dg" || s == "11") {
return Player(10);
}
else if (s == "brown" || s == "12") {
return Player(11);
}
for(0 <= i <= 12) {
o = StringCase(GetPlayerName(Player(i)), false);
for(0 <= j <= StringLength(o) - StringLength(s)) {
if (SubString(o, j, j + StringLength(s)) == s) {
return Player(i);
}
}
}
return null;
}
struct ResourceSender {
private integer amountFrom;
private integer amountTo;
private player playerFrom;
private player playerTo;
private playerstate resourceType;
private boolean withTaxes = false;
public static method create(integer amount, player playerFrom, player playerTo, playerstate resourceType) -> thistype {
thistype this = thistype.allocate();
this.playerFrom = playerFrom;
this.playerTo = playerTo;
this.resourceType = resourceType;
this.setAmount(amount);
this.limitAmount();
return this;
}
private method setAmount(integer amount) {
if (amount > GetPlayerState(this.playerFrom, this.resourceType)) {
amount = GetPlayerState(this.playerFrom, this.resourceType);
}
this.amountFrom = amount;
this.amountTo = amount;
}
private method limitAmount() {
this.withTaxes = false;
this.amountTo = R2I(this.amountFrom);
// Sending 3g results to sending 2g and receiving 1g
this.amountFrom = R2I(this.amountTo);
}
public method send() {
string resourceName = "";
string taxes = "";
if (this.amountTo <= 0) {
return;
}
if (this.resourceType == PLAYER_STATE_RESOURCE_GOLD) {
resourceName = "gold";
}
else if(this.resourceType == PLAYER_STATE_RESOURCE_LUMBER) {
resourceName = "lumber";
}
if (this.withTaxes) {
taxes = " " + COLOR_DARKGRAY + "(" + I2S(R2I(TAX * 100)) + "% tax)|r";
}
SetPlayerState(this.playerFrom, this.resourceType, GetPlayerState(this.playerFrom, this.resourceType) - this.amountFrom);
SetPlayerState(this.playerTo, this.resourceType, GetPlayerState(this.playerTo, this.resourceType) + this.amountTo);
DisplayTimedTextToPlayer(this.playerFrom, 0, 0, 15, "|cffffcc00Sent " + I2S(this.amountTo) + " " + resourceName + " to " + GetPlayerNameColored(this.playerTo));
DisplayTimedTextToPlayer(this.playerTo, 0, 0, 15, "|cffffcc00Received " + I2S(this.amountTo) + " " + resourceName + " from " + GetPlayerNameColored(this.playerFrom));
}
}
private function ParseInt(string s) -> integer {
string d = "0123456789";
integer r = 0;
integer i = 0;
integer m;
string c;
if (s == "") {
return -1;
}
while(true) {
if (i >= StringLength(s)) {
break;
}
c = SubString(s, i, i + 1);
m = 0;
while(true) {
if (m >= 10) {
break;
}
if(SubString(d, m, m + 1) == c) {
break;
}
m = m + 1;
}
if (m < 10) {
r = r * 10 + m;
}
else if (c == "k" || c == "K") {
if (i < StringLength(s) - 1) {
return -1;
}
r = r * 1000;
}
else {
return -1;
}
if (r >= 1000000) {
return 1000000;
}
i = i + 1;
}
return r;
}
private function ParseAmount(string s) {
integer i;
r_player = null;
r_amount = 0;
s = Trim(s);
i = StringLength(s) - 1;
while(i >= 0) {
if (SubString(s, i, i + 1) == " ") {
break;
}
i = i - 1;
}
if (i < 0) {
return;
}
r_amount = ParseInt(SubString(s, i + 1, StringLength(s)));
if (r_amount >= 0) {
r_player = GetPlayerByName(Trim(SubString(s, 0, i)));
}
}
private function OnGold() -> boolean {
string s = GetEventPlayerChatString();
player p = GetTriggerPlayer();
player mainPlayer = GetLocalPlayer();
ResourceSender sender;
if (SubString(s, 0, 6) == "-gold ") {
ParseAmount(SubString(s, 6, StringLength(s)));
}
else if (SubString(s, 0, 3) == "-g ") {
ParseAmount(SubString(s, 3, StringLength(s)));
}
else {
return false;
}
if (r_player == null) {
DisplayTimedTextToPlayer(p, 0, 0, 10, "|cffff0000Syntax: -gold <player number/color> <amount>|r");
}
else if (p == r_player || !IsPlayerAlly(p, r_player)) {
DisplayTimedTextToPlayer(p, 0, 0, 10, "|cffff0000Can only send resources to allies|r");
}
else if (GetPlayerState(p, PLAYER_STATE_RESOURCE_GOLD) > 0) {
sender = ResourceSender.create(r_amount, p, r_player, PLAYER_STATE_RESOURCE_GOLD);
sender.send();
sender.destroy();
}
return false;
}
private function onInit() {
trigger trg_gold = CreateTrigger();
// Gold
TriggerRegisterAnyPlayerChatEvent(trg_gold, "-gold ", false);
TriggerRegisterAnyPlayerChatEvent(trg_gold, "-g ", false);
TriggerAddCondition(trg_gold, Condition(function OnGold));
}
}
//! endzinc
scope Refund initializer init
native GetUnitGoldCost takes integer id returns integer
native GetUnitWoodCost takes integer id returns integer
globals
private constant real REFUND_RETURN_RATE_GOLD = 1.00 // Set the percentage return rate
private constant real REFUND_RETURN_RATE_WOOD = 1.00 // Set the percentage return rate
private constant real HITPOINTS_REQUIRED = 100 // Set the required life percentage of the building you are refunding
private constant string STRING_MSG = "|cff808080This building is hurt and may not be refunded." // Set the message to let the player know he cannot perform the action due to missing hitpoints
private constant boolean WANT_HP_CHECK = false // If you want to check for hitpoints, set this to true. If you do not want to check hitpoints, set it to false.
private constant string SFX_MODEL = "UI\\Feedback\\GoldCredit\\GoldCredit.mdl" // Special effect model
private constant integer REFUND_ABIL_ID = 'A01D' // Refund ability raw code
endglobals
private function main takes nothing returns nothing
local unit u = GetTriggerUnit()
local integer id = GetUnitTypeId(u)
local texttag tg
local texttag tl
local integer goldAmount
local integer woodAmount
if (GetSpellAbilityId() != REFUND_ABIL_ID) then
set u = null
return
endif
if GetUnitLifePercent(u) == HITPOINTS_REQUIRED or WANT_HP_CHECK == false then
set tg = CreateTextTag()
set tl = CreateTextTag()
set goldAmount = R2I(GetUnitGoldCost(id) * REFUND_RETURN_RATE_GOLD)
set woodAmount = R2I(GetUnitWoodCost(id) * REFUND_RETURN_RATE_WOOD)
call SetPlayerState(GetOwningPlayer(u), PLAYER_STATE_RESOURCE_GOLD, (GetPlayerState(GetOwningPlayer(u), PLAYER_STATE_RESOURCE_GOLD) + goldAmount))
call SetPlayerState(GetOwningPlayer(u), PLAYER_STATE_RESOURCE_LUMBER, (GetPlayerState(GetOwningPlayer(u), PLAYER_STATE_RESOURCE_LUMBER) + woodAmount))
call KillUnit(u)
call DestroyEffect(AddSpecialEffectTarget(SFX_MODEL, u, "overhead"))
// Gold Text Tag
call SetTextTagText(tg, "(+" + I2S(goldAmount) + ")", 0.020)
call SetTextTagPos(tg, GetUnitX(u), GetUnitY(u), 0.00)
call SetTextTagColor(tg, 255, 220, 0, 255)
call SetTextTagVelocity(tg, 0, .02)
call SetTextTagVisibility(tg, true)
call SetTextTagFadepoint(tg, 0.10)
call SetTextTagLifespan(tg, 1.5)
call SetTextTagPermanent(tg, false)
// Lumber Text Tag
call SetTextTagText(tl, "(+" + I2S(woodAmount)+ ")", 0.020)
call SetTextTagPos(tl, GetUnitX(u), GetUnitY(u) - 50, 0.00)
call SetTextTagColor(tl, 0, 255, 0, 0)
call SetTextTagVelocity(tl, 0, - 0.02)
call SetTextTagVisibility(tl, true)
call SetTextTagFadepoint(tl, 0.10)
call SetTextTagLifespan(tl, 1.5)
call SetTextTagPermanent(tl, false)
else
call DisplayTextToPlayer(GetOwningPlayer(u), 0, 0, STRING_MSG)
endif
set tg = null
set tl = null
set u = null
endfunction
private function init takes nothing returns nothing
local trigger t = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(t, Condition(function main))
set t = null
endfunction
endscope