Merge pull request #374 from Buurazu/master

MCM file rewrite + many bug fixes
This commit is contained in:
wofsauge authored and GitHub committed 2022-02-06 16:21:02 +01:00
commit 6ce8a994f3
7 files changed
+319 -918

No files matched your search

+2 -2
View File
@@ -88,7 +88,7 @@ local repCollectibles={
[211] = {"211", "Spiderbaby", "Spawn 3-5 Blue Spiders upon taking damage"}, -- Spiderbaby [211] = {"211", "Spiderbaby", "Spawn 3-5 Blue Spiders upon taking damage"}, -- Spiderbaby
[214] = {"214", "Anemic", "↑ +1.5 Range up#Leave a trail of damaging creep upon taking damage"}, -- Anemic [214] = {"214", "Anemic", "↑ +1.5 Range up#Leave a trail of damaging creep upon taking damage"}, -- Anemic
[218] = {"218", "Placenta", "↑ +1 Health up#Heals 1 Red Heart#Chance to heal half a heart every minute"}, -- Placenta [218] = {"218", "Placenta", "↑ +1 Health up#Heals 1 Red Heart#Chance to heal half a heart every minute"}, -- Placenta
[222] = {"222", "Anti-Gravity", "Holding the fire buttons causes tears to hover in midair#When released, they will all shoot in the direction they were fired#↑ +2 Fire Rate up"}, -- Anti-Gravity [222] = {"222", "Anti-Gravity", "Holding the fire buttons causes tears to hover in midair#When released, they will all shoot in the direction they were fired#↑ +1 Fire Rate up"}, -- Anti-Gravity
[224] = {"224", "Cricket's Body", "Tears split in 4 on hit#Split tears deal half your damage#↑ +0.5 Fire Rate up#↓ -20% Range down"}, -- Cricket's Body [224] = {"224", "Cricket's Body", "Tears split in 4 on hit#Split tears deal half your damage#↑ +0.5 Fire Rate up#↓ -20% Range down"}, -- Cricket's Body
[228] = {"228", "Mom's Perfume", "15% chance to shoot Fear tears#↑ +0.5 Fire Rate up"}, -- Mom's Perfume [228] = {"228", "Mom's Perfume", "15% chance to shoot Fear tears#↑ +0.5 Fire Rate up"}, -- Mom's Perfume
[230] = {"230", "Abaddon", "↑ +1.5 Damage up#↑ +0.2 Speed up#Fear tears#Converts all Red Heart Containers into Black Hearts#+2 Black Hearts"}, -- Abaddon [230] = {"230", "Abaddon", "↑ +1.5 Damage up#↑ +0.2 Speed up#Fear tears#Converts all Red Heart Containers into Black Hearts#+2 Black Hearts"}, -- Abaddon
@@ -125,7 +125,7 @@ local repCollectibles={
[307] = {"307", "Capricorn", "↑ +1 Health up#↑ +0.5 Damage up#↑ +0.1 Speed up#↑ +0.75 Range up#↑ +0.5 Fire Rate up#Gives one bomb, coin and key"}, -- Capricorn [307] = {"307", "Capricorn", "↑ +1 Health up#↑ +0.5 Damage up#↑ +0.1 Speed up#↑ +0.75 Range up#↑ +0.5 Fire Rate up#Gives one bomb, coin and key"}, -- Capricorn
[308] = {"308", "Aquarius", "Leave a trail of creep#Creep deals 66% your damage per second#Creep synergizes with tear effects"}, -- Aquarius [308] = {"308", "Aquarius", "Leave a trail of creep#Creep deals 66% your damage per second#Creep synergizes with tear effects"}, -- Aquarius
[309] = {"309", "Pisces", "↑ +0.5 Fire Rate up#Increases tear knockback"}, [309] = {"309", "Pisces", "↑ +0.5 Fire Rate up#Increases tear knockback"},
[310] = {"310", "Eve's Mascara", "↑ 200% Damage up#↓ -33% Tears down#↓ -0.5 Shot Speed down"}, [310] = {"310", "Eve's Mascara", "↑ +100% Damage up#↓ -33% Tears down#↓ -0.5 Shot Speed down"},
[314] = {"314", "Thunder Thighs", "↑ +1 Health up#↓ -0.4 Speed down#Heals 1 Red Heart#Destroy rocks when walking over them"}, -- Thunder Thighs [314] = {"314", "Thunder Thighs", "↑ +1 Health up#↓ -0.4 Speed down#Heals 1 Red Heart#Destroy rocks when walking over them"}, -- Thunder Thighs
[315] = {"315", "Strange Attractor", "Magnetic tears#Affects enemies, pickups and trinkets#Items will be attracted to where the tear lands"}, -- Strange Attractor [315] = {"315", "Strange Attractor", "Magnetic tears#Affects enemies, pickups and trinkets#Items will be attracted to where the tear lands"}, -- Strange Attractor
[320] = {"320", "???'s Only Friend", "Controllable Fly#Deals 3.5 contact damage per tick"}, -- ???'s Only Friend [320] = {"320", "???'s Only Friend", "Controllable Fly#Deals 3.5 contact damage per tick"}, -- ???'s Only Friend
+25 -4
View File
@@ -199,7 +199,8 @@ function EID:addColor(shortcut, kColor, callback)
end end
-- Overrides all potentially displayed texts and permanently displays the given texts. Can be turned of again using the "EID:hidePermanentText()" function -- Overrides all potentially displayed texts and permanently displays the given texts. Can be turned of again using the "EID:hidePermanentText()" function
function EID:displayPermanentText(descriptionObject) function EID:displayPermanentText(descriptionObject, permName1, permName2)
descriptionObject.PermanentTextEnglish = EID:getDescriptionEntryEnglish(permName1, permName2)
EID.permanentDisplayTextObj = descriptionObject EID.permanentDisplayTextObj = descriptionObject
EID.isDisplayingPermanent = true EID.isDisplayingPermanent = true
end end
@@ -264,8 +265,11 @@ end
-- returns the current text position -- returns the current text position
function EID:getTextPosition() function EID:getTextPosition()
local posVector = Vector(EID.UsedPosition.X, EID.UsedPosition.Y) local posVector = Vector(EID.UsedPosition.X, EID.UsedPosition.Y)
for _, modifier in pairs(EID.PositionModifiers) do -- Only apply position modifiers when not in Local Mode
posVector = posVector + modifier if EID.CurrentScaleType == "Size" then
for _, modifier in pairs(EID.PositionModifiers) do
posVector = posVector + modifier
end
end end
return posVector return posVector
end end
@@ -367,6 +371,13 @@ function EID:getDescriptionEntry(objTable, objID, noFallback)
else return (translatedTable and translatedTable[objID]) or (EID.descriptions["en_us"][objTable] and EID.descriptions["en_us"][objTable][objID]) end else return (translatedTable and translatedTable[objID]) or (EID.descriptions["en_us"][objTable] and EID.descriptions["en_us"][objTable][objID]) end
end end
end end
function EID:getDescriptionEntryEnglish(objTable, objID)
if not objID then
return EID.descriptions["en_us"][objTable]
else
return EID.descriptions["en_us"][objTable] and EID.descriptions["en_us"][objTable][objID]
end
end
-- returns the description data table related to a given id, variant and subtype -- returns the description data table related to a given id, variant and subtype
-- falls back to english if it doesnt exist -- falls back to english if it doesnt exist
@@ -915,7 +926,7 @@ function EID:CheckGlitchedItemConfig(id)
local localizedNames = EID:getDescriptionEntry("GlitchedItemText") local localizedNames = EID:getDescriptionEntry("GlitchedItemText")
local item = EID.itemConfig:GetCollectible(id) local item = EID.itemConfig:GetCollectible(id)
if not item then return "" end if not item then return "" end
local attributes = "" local attributes = "#"
for _,v in ipairs(itemConfigItemAttributes) do for _,v in ipairs(itemConfigItemAttributes) do
local val = item[v] local val = item[v]
if val ~= 0 then if val ~= 0 then
@@ -1211,6 +1222,16 @@ function EID:fixDefinedFont()
EID.Config["TextboxWidth"] = EID.descriptions[curLang].fonts[1].textboxWidth or EID.DefaultConfig["TextboxWidth"] EID.Config["TextboxWidth"] = EID.descriptions[curLang].fonts[1].textboxWidth or EID.DefaultConfig["TextboxWidth"]
return true return true
end end
-- Check if a given font name is valid for the currently selected language
function EID:canUseFontType(fontType)
local curLang = EID.Config["Language"]
for _, v in ipairs(EID.descriptions[curLang].fonts) do
if fontType == v.name then
return true
end
end
return false
end
-- Creates a copy of a KColor object. This prevents overwriting existing -- Creates a copy of a KColor object. This prevents overwriting existing
function EID:copyKColor(colorObj) function EID:copyKColor(colorObj)
+23 -42
View File
@@ -174,6 +174,7 @@ local componentShifts = {
local poolToIcon = { [0]="{{TreasureRoom}}",[1]="{{Shop}}",[2]="{{BossRoom}}",[3]="{{DevilRoom}}",[4]="{{AngelRoom}}", local poolToIcon = { [0]="{{TreasureRoom}}",[1]="{{Shop}}",[2]="{{BossRoom}}",[3]="{{DevilRoom}}",[4]="{{AngelRoom}}",
[5]="{{SecretRoom}}",[7]="{{PoopRoomIcon}}",[8]="{{GoldenChestRoomIcon}}",[9]="{{RedChestRoomIcon}}",[12]="{{CursedRoom}}",[26]="{{Planetarium}}" } [5]="{{SecretRoom}}",[7]="{{PoopRoomIcon}}",[8]="{{GoldenChestRoomIcon}}",[9]="{{RedChestRoomIcon}}",[12]="{{CursedRoom}}",[26]="{{Planetarium}}" }
-- local copies of our XML data in case it's slightly faster
local CraftingMaxItemID = EID.XMLMaxItemID local CraftingMaxItemID = EID.XMLMaxItemID
local CraftingFixedRecipes = EID.XMLRecipes local CraftingFixedRecipes = EID.XMLRecipes
local CraftingItemPools = EID.XMLItemPools local CraftingItemPools = EID.XMLItemPools
@@ -208,7 +209,7 @@ local function sortAllItems()
end end
end) end)
end end
-- delay the initial sort until needed, as it's a tad slow -- delay the initial sort until needed, in case of modded items
local sortNeeded = true local sortNeeded = true
local recheckPickups = false local recheckPickups = false
@@ -350,28 +351,27 @@ function EID:simulateBagOfCrafting(componentsTable)
end end
-- The main function that takes 8 ingredients and tells you what collectible you will get in return -- The main function that takes 8 ingredients and tells you what collectible you will get in return
-- Only pass in a table with 8 valid ingredients!!!
function EID:calculateBagOfCrafting(componentsTable) function EID:calculateBagOfCrafting(componentsTable)
-- ingredients must be sorted by ID for the RNG shifting to be accurate, so make a local copy
local components = {table.unpack(componentsTable)} local components = {table.unpack(componentsTable)}
if components == nil or #components ~= 8 then
return 0
end
customRNGSeed = lastSeedUsed
table.sort(components) table.sort(components)
local componentsAsString = table.concat(components, ",") local componentsAsString = table.concat(components, ",")
--Check the fixed recipes. Currently, the fixed recipes ignore item unlock status -- Check the fixed recipes. Currently, the fixed recipes ignore item unlock status
local cacheResult = CraftingFixedRecipes[componentsAsString] local cacheResult = CraftingFixedRecipes[componentsAsString]
if cacheResult ~= nil then if cacheResult ~= nil then
return cacheResult, cacheResult return cacheResult, cacheResult
end end
-- Check the recipes already calculated for this seed
cacheResult = calculatedRecipes[componentsAsString] cacheResult = calculatedRecipes[componentsAsString]
local lockedResult = lockedRecipes[componentsAsString] local lockedResult = lockedRecipes[componentsAsString]
if cacheResult ~= nil then if cacheResult ~= nil then
return cacheResult, lockedResult return cacheResult, lockedResult
end end
-- Count up the ingredients, and shift the RNG based on the components in the bag
customRNGSeed = lastSeedUsed
local compTotalWeight = 0 local compTotalWeight = 0
local compCounts = {} local compCounts = {}
for i = 1, #componentShifts do for i = 1, #componentShifts do
@@ -384,6 +384,7 @@ function EID:calculateBagOfCrafting(componentsTable)
RNGNext() RNGNext()
end end
customRNGShift = componentShifts[7] customRNGShift = componentShifts[7]
local poolWeights = { local poolWeights = {
{idx = 0, weight = 1}, {idx = 0, weight = 1},
{idx = 1, weight = 2}, {idx = 1, weight = 2},
@@ -401,11 +402,8 @@ function EID:calculateBagOfCrafting(componentsTable)
end end
local totalWeight = 0 local totalWeight = 0
local itemWeights = {} local itemWeights = {}
for i = 1, CraftingMaxItemID do
local maxItemID = CraftingMaxItemID
for i = 1, maxItemID do
itemWeights[i] = 0 itemWeights[i] = 0
end end
@@ -414,6 +412,7 @@ function EID:calculateBagOfCrafting(componentsTable)
local qualityMin = 0 local qualityMin = 0
local qualityMax = 1 local qualityMax = 1
local n = compTotalWeight local n = compTotalWeight
-- Devil, Angel, and Secret Room Pools have a 5 point penalty
if (poolWeight.idx >= 3) and (poolWeight.idx <= 5) then if (poolWeight.idx >= 3) and (poolWeight.idx <= 5) then
n = n - 5 n = n - 5
end end
@@ -456,8 +455,8 @@ function EID:calculateBagOfCrafting(componentsTable)
--That 2nd pick could also be achievement locked but we're ignoring that... --That 2nd pick could also be achievement locked but we're ignoring that...
local firstOption = nil local firstOption = nil
while true do while true do
local t = nextFloat() local t = nextFloat() -- number between 0 and 1
local target = t * totalWeight local target = t * totalWeight -- number between 0 and total weight of possible results
for k,v in ipairs(itemWeights) do for k,v in ipairs(itemWeights) do
target = target - v target = target - v
if target < 0 then if target < 0 then
@@ -510,31 +509,14 @@ local function qualitySort(a, b)
end end
end end
-- simple table of tables copy function, for modded recipe support (to make a local copy of the XML data tables so we can then add on to them)
local function deepcopy(orig)
local orig_type = type(orig)
local copy
if orig_type == 'table' then
copy = {}
for orig_key, orig_value in next, orig, nil do
copy[deepcopy(orig_key)] = deepcopy(orig_value)
end
setmetatable(copy, deepcopy(getmetatable(orig)))
else -- number, string, boolean, etc
copy = orig
end
return copy
end
local moddedCrafting = false local moddedCrafting = false
-- Check for modded items past the known max item ID on game start (can also support game updates) -- Check for modded items past the known max item ID on game start (can also support game updates)
-- Only works if the new items are at Weight 1.0 in their item pools, but better than nothing -- Only works if the new items are at Weight 1.0 in their item pools, but better than nothing
local function GameStartCrafting() local function GameStartCrafting()
if not EID:PlayersHaveCollectible(CollectibleType.COLLECTIBLE_TMTRAINER) and EID.itemConfig:GetCollectible(EID.XMLMaxItemID+1) ~= nil then if EID.Config["BagOfCraftingModdedRecipes"] and not EID:PlayersHaveCollectible(CollectibleType.COLLECTIBLE_TMTRAINER) and EID.itemConfig:GetCollectible(EID.XMLMaxItemID+1) ~= nil then
-- Items past max ID detected; copy our XML tables so we can add to them dofile("eid_xmldata")
CraftingMaxItemID = EID.XMLMaxItemID -- Items past max ID detected
CraftingItemPools = deepcopy(EID.XMLItemPools) CraftingMaxItemID = EID.XMLMaxItemID -- XMLMaxItemID is never modified
CraftingItemQualities = deepcopy(EID.XMLItemQualities)
-- Add new item qualities -- Add new item qualities
local coll = EID.itemConfig:GetCollectible(CraftingMaxItemID+1) local coll = EID.itemConfig:GetCollectible(CraftingMaxItemID+1)
while coll ~= nil do while coll ~= nil do
@@ -559,9 +541,8 @@ local function GameStartCrafting()
moddedCrafting = true moddedCrafting = true
sortNeeded = true sortNeeded = true
elseif moddedCrafting then elseif moddedCrafting then
CraftingMaxItemID = EID.XMLMaxItemID -- we had modded items; they have since been disabled
CraftingItemPools = EID.XMLItemPools dofile("eid_xmldata")
CraftingItemQualities = EID.XMLItemQualities
moddedCrafting = false moddedCrafting = false
sortNeeded = true sortNeeded = true
end end
@@ -768,7 +749,7 @@ end
local function getFloorItemsString(showPreviews, roomItems) local function getFloorItemsString(showPreviews, roomItems)
local floorString = "" local floorString = ""
if #EID.BagItems >0 then if #EID.BagItems >0 then
if showPreviews and #EID.BagItems >= 8 then if showPreviews and #EID.BagItems == 8 then
local recipe = EID:calculateBagOfCrafting(EID.BagItems) local recipe = EID:calculateBagOfCrafting(EID.BagItems)
floorString = floorString .. "{{Collectible"..recipe.."}} " floorString = floorString .. "{{Collectible"..recipe.."}} "
end end
@@ -916,7 +897,7 @@ function EID:handleBagOfCraftingRendering()
end end
-- Determine if we should display anything at all -- Determine if we should display anything at all
if EID.isHidden or craftingIsHidden or game.Challenge == Challenge.CHALLENGE_CANTRIPPED then if ((EID.isHidden or craftingIsHidden) and EID.MCMCompat_isDisplayingEIDTab ~= "Crafting") or game.Challenge == Challenge.CHALLENGE_CANTRIPPED then
return return
elseif EID.Config["BagOfCraftingHideInBattle"] then elseif EID.Config["BagOfCraftingHideInBattle"] then
if Isaac.CountBosses() > 0 or Isaac.CountEnemies() > 0 then if Isaac.CountBosses() > 0 or Isaac.CountEnemies() > 0 then
@@ -934,7 +915,7 @@ function EID:handleBagOfCraftingRendering()
end end
-- Display the result of the 8 items in our bag if applicable -- Display the result of the 8 items in our bag if applicable
if (showCraftingResult or EID.Config["BagOfCraftingDisplayMode"] == "Preview Only") and #EID.BagItems >= 8 then if (showCraftingResult or EID.Config["BagOfCraftingDisplayMode"] == "Preview Only") and #EID.BagItems == 8 then
local craftingResult, backupResult = EID:calculateBagOfCrafting(EID.BagItems) local craftingResult, backupResult = EID:calculateBagOfCrafting(EID.BagItems)
if (backupResult ~= craftingResult) then EID.TabPreviewID = backupResult end if (backupResult ~= craftingResult) then EID.TabPreviewID = backupResult end
local descriptionObj = EID:getDescriptionObj(5, 100, craftingResult) local descriptionObj = EID:getDescriptionObj(5, 100, craftingResult)
+10 -4
View File
@@ -75,10 +75,10 @@ EID.UserConfig = {
-- Toggle obstruction based hiding, when the player has flight -- Toggle obstruction based hiding, when the player has flight
-- Default = true -- Default = true
["DisableObstructionOnFlight"] = true, ["DisableObstructionOnFlight"] = true,
-- If set to true, the mod will no longer display a warning if the save game doesn't have achievements unlocked -- If set to true, the mod will no longer display critical warnings during the start of a new game
-- This also disables warnings for using an outdated game version and for having potentially modded Bag of Crafting recipes -- Current warnings are: Achievements are locked, outdated game version, and potentially having inaccurate modded Bag of Crafting recipes
-- Default = false -- Default = false
["DisableAchievementCheck"] = false, ["DisableStartOfRunWarnings"] = false,
---------- Display Modes ----------- ---------- Display Modes -----------
@@ -275,6 +275,11 @@ EID.UserConfig = {
-- Display recipes as 8 icons instead of grouped ingredients -- Display recipes as 8 icons instead of grouped ingredients
-- Default = false -- Default = false
["BagOfCraftingDisplayIcons"] = false, ["BagOfCraftingDisplayIcons"] = false,
-- Enable or disable basic modded item support
-- Only modded items with a weight of 1.0 in their item pools are supported, as we can't determine modded item pool weight
-- If you have a lot of modded items, it will slow down game launch
-- Default = true
["BagOfCraftingModdedRecipes"] = true,
-- Set the keybinding to toggle the crafting display, so you can see descriptions of items/pickups on the floor -- Set the keybinding to toggle the crafting display, so you can see descriptions of items/pickups on the floor
-- Look into the AB+ or Repentance documentation for the key names here: https://wofsauge.github.io/IsaacDocs/rep/enums/Keyboard.html -- Look into the AB+ or Repentance documentation for the key names here: https://wofsauge.github.io/IsaacDocs/rep/enums/Keyboard.html
-- Default = Keyboard.KEY_F3 -- Default = Keyboard.KEY_F3
@@ -390,7 +395,7 @@ EID.DefaultConfig = {
["InitiallyHidden"] = false, ["InitiallyHidden"] = false,
["HideInBattle"] = false, ["HideInBattle"] = false,
["DisableObstructionOnFlight"] = true, ["DisableObstructionOnFlight"] = true,
["DisableAchievementCheck"] = false, ["DisableStartOfRunWarnings"] = false,
["DisableOnCurse"] = true, ["DisableOnCurse"] = true,
["DisableOnAltPath"] = true, ["DisableOnAltPath"] = true,
["DisableOnAprilFoolsChallenge"] = true, ["DisableOnAprilFoolsChallenge"] = true,
@@ -432,6 +437,7 @@ EID.DefaultConfig = {
["BagOfCraftingDisplayIcons"] = false, ["BagOfCraftingDisplayIcons"] = false,
["BagOfCraftingHideInBattle"] = true, ["BagOfCraftingHideInBattle"] = true,
["BagOfCraftingDisplayMode"] = "Recipe List", ["BagOfCraftingDisplayMode"] = "Recipe List",
["BagOfCraftingModdedRecipes"] = true,
["CraftingHideKey"] = Keyboard.KEY_F3, ["CraftingHideKey"] = Keyboard.KEY_F3,
["CraftingHideButton"] = -1, ["CraftingHideButton"] = -1,
["CraftingResultKey"] = Keyboard.KEY_F4, ["CraftingResultKey"] = Keyboard.KEY_F4,
+14 -11
View File
@@ -120,6 +120,15 @@ local function BlackRuneCallback(descObj)
return VoidCallback(descObj, true) return VoidCallback(descObj, true)
end end
-- Handle Item Collection description addition
local function ItemCollectionPageCallback(descObj)
descObj.Name = "{{"..EID.Config["ItemCollectionColor"].."}}"..descObj.Name
local text = EID:getDescriptionEntry("CollectionPageInfo")
EID:appendToDescription(descObj, "#{{Warning}} "..text)
return descObj
end
if REPENTANCE then if REPENTANCE then
-- Handle Birthright -- Handle Birthright
@@ -403,20 +412,13 @@ if REPENTANCE then
return descObj return descObj
end end
-- Handle Item Collection description addition
local function ItemCollectionPageCallback(descObj)
descObj.Name = "{{"..EID.Config["ItemCollectionColor"].."}}"..descObj.Name
local text = EID:getDescriptionEntry("CollectionPageInfo")
EID:appendToDescription(descObj, "#{{Warning}} "..text)
return descObj
end
-------------------------------- --------------------------------
-- Although individual conditions/callbacks work well for mods to be able to add through the API, -- Although individual conditions/callbacks work well for mods to be able to add through the API,
-- As we kept adding callbacks for vanilla items, a lot of code got repeated over and over -- As we kept adding callbacks for vanilla items, a lot of code got repeated over and over
-- This one-condition setup fixes that and can only help performance -- This one-condition setup fixes that and can only help performance
-- It also allows us to pick the order that modifiers are appended to descriptions (stats/effects first, then reroll/flip/recharge info) -- It also allows us to pick the order that modifiers are appended to descriptions (stats/effects first, then reroll/flip/recharge info)
-- REPENTANCE-ONLY MODIFIERS
local function EIDConditions(descObj) local function EIDConditions(descObj)
-- currently, only pickup descriptions have modifiers -- currently, only pickup descriptions have modifiers
if descObj.ObjType ~= 5 then return false end if descObj.ObjType ~= 5 then return false end
@@ -431,15 +433,13 @@ if REPENTANCE then
-- Check Birthright first because it overwrites the description instead of appending to it -- Check Birthright first because it overwrites the description instead of appending to it
if descObj.ObjSubType == 619 then table.insert(callbacks, BirthrightCallback) end if descObj.ObjSubType == 619 then table.insert(callbacks, BirthrightCallback) end
if EID:requiredForCollectionPage(descObj.ObjSubType) then table.insert(callbacks, ItemCollectionPageCallback) end
if collectiblesOwned[664] then table.insert(callbacks, BingeEaterCallback) end if collectiblesOwned[664] then table.insert(callbacks, BingeEaterCallback) end
if collectiblesOwned[59] then table.insert(callbacks, BookOfBelialCallback) end if collectiblesOwned[59] then table.insert(callbacks, BookOfBelialCallback) end
if collectiblesOwned[584] then table.insert(callbacks, BookOfVirtuesCallback) end if collectiblesOwned[584] then table.insert(callbacks, BookOfVirtuesCallback) end
if collectiblesOwned[706] or (EID.absorbedItems[706] and collectiblesOwned[477]) then table.insert(callbacks, AbyssCallback) end if collectiblesOwned[706] or (EID.absorbedItems[706] and collectiblesOwned[477]) then table.insert(callbacks, AbyssCallback) end
if collectiblesOwned[711] and EID:getEntityData(descObj.Entity, "EID_FlipItemID") then table.insert(callbacks, FlipCallback) end if collectiblesOwned[711] and EID:getEntityData(descObj.Entity, "EID_FlipItemID") then table.insert(callbacks, FlipCallback) end
if (collectiblesOwned[723] or (EID.absorbedItems[723] and collectiblesOwned[477])) and descObj.ObjSubType ~= 668 then table.insert(callbacks, SpindownDiceCallback) end if EID.Config["SpindownDiceResults"] > 0 and (collectiblesOwned[723] or (EID.absorbedItems[723] and collectiblesOwned[477])) and descObj.ObjSubType ~= 668 then table.insert(callbacks, SpindownDiceCallback) end
-- Card / Rune Callbacks -- Card / Rune Callbacks
elseif descObj.ObjVariant == PickupVariant.PICKUP_TAROTCARD then elseif descObj.ObjVariant == PickupVariant.PICKUP_TAROTCARD then
@@ -466,6 +466,7 @@ if REPENTANCE then
end end
-- AFTERBIRTH+ OR REPENTANCE MODIFIERS
local function EIDConditionsAB(descObj) local function EIDConditionsAB(descObj)
-- currently, only pickup descriptions have modifiers -- currently, only pickup descriptions have modifiers
if descObj.ObjType ~= 5 then return false end if descObj.ObjType ~= 5 then return false end
@@ -476,6 +477,8 @@ local function EIDConditionsAB(descObj)
-- Collectible Pedestal Callbacks -- Collectible Pedestal Callbacks
if descObj.ObjVariant == PickupVariant.PICKUP_COLLECTIBLE then if descObj.ObjVariant == PickupVariant.PICKUP_COLLECTIBLE then
if EID:requiredForCollectionPage(descObj.ObjSubType) then table.insert(callbacks, ItemCollectionPageCallback) end
if EID.Config["DisplayVoidStatInfo"] then if EID.Config["DisplayVoidStatInfo"] then
if collectiblesOwned[477] then table.insert(callbacks, VoidCallback) end if collectiblesOwned[477] then table.insert(callbacks, VoidCallback) end
if blackRuneOwned then table.insert(callbacks, BlackRuneCallback) end if blackRuneOwned then table.insert(callbacks, BlackRuneCallback) end
+74 -74
View File
@@ -384,6 +384,7 @@ local scaleMin = 0.1
local scaleMax = 2 local scaleMax = 2
local scaleSpeed = 0.01 -- scale size per frame local scaleSpeed = 0.01 -- scale size per frame
local scaleToBigger = true local scaleToBigger = true
EID.CurrentScaleType = "Size" -- Size or LocalModeSize; checked by EID:getTextPosition() to not apply modifiers in local mode
local scaleHoldFrame = 0 local scaleHoldFrame = 0
local function handleScaleKey() local function handleScaleKey()
local scaleKey = EID.Config["SizeHotkey"] local scaleKey = EID.Config["SizeHotkey"]
@@ -392,26 +393,20 @@ local function handleScaleKey()
if Input.IsButtonPressed(scaleKey, 0) then if Input.IsButtonPressed(scaleKey, 0) then
if scaleHoldFrame > 60 then if scaleHoldFrame > 60 then
EID.MCM_OptionChanged = true EID.MCM_OptionChanged = true
local scaleConfigName = (EID.Config["DisplayMode"] == "local" and "LocalModeSize" or "Size") local newScale
if scaleToBigger then if scaleToBigger then
local newScale = EID.Scale + scaleSpeed newScale = EID.Scale + scaleSpeed
EID.Scale = newScale
EID.Config[scaleConfigName] = newScale
if newScale > scaleMax then if newScale > scaleMax then
scaleToBigger = false scaleToBigger = false
end end
else else
local newScale = EID.Scale - scaleSpeed newScale = EID.Scale - scaleSpeed
EID.Scale = newScale
EID.Config[scaleConfigName] = newScale
if newScale < scaleMin then if newScale < scaleMin then
scaleToBigger = true scaleToBigger = true
end end
end end
EID.Scale = newScale
EID.Config[EID.CurrentScaleType] = newScale
else else
scaleHoldFrame = scaleHoldFrame + 1 scaleHoldFrame = scaleHoldFrame + 1
end end
@@ -420,24 +415,18 @@ local function handleScaleKey()
if Input.IsButtonTriggered(scaleKey, 0) then if Input.IsButtonTriggered(scaleKey, 0) then
EID.MCM_OptionChanged = true EID.MCM_OptionChanged = true
scaleHoldFrame = 0 scaleHoldFrame = 0
local scale local scale = EID.Scale
local scaleConfigName = (EID.Config["DisplayMode"] == "local" and "LocalModeSize" or "Size")
scale = EID.Scale
-- switch between 1, 1.5 and 0.5 -- switch between 1, 1.5 and 0.5
if math.abs(scale - 1) < 0.01 then if math.abs(scale - 1) < 0.01 then
scale = 1.5 scale = 1.5
elseif math.abs(scale - 1.5) < 0.01 then elseif math.abs(scale - 1.5) < 0.01 then
scale = 0.5 scale = 0.5
elseif math.abs(scale - 0.5) < 0.01 then
scale = 1
else else
scale = 1 scale = 1
end end
EID.Config[scaleConfigName] = scale EID.Config[EID.CurrentScaleType] = scale
EID.Scale = scale EID.Scale = scale
end end
end end
@@ -551,11 +540,11 @@ function EID:printDescription(desc)
local curLanguage = EID.Config["Language"] local curLanguage = EID.Config["Language"]
if curLanguage ~= "en_us" then if curLanguage ~= "en_us" then
EID.Config["Language"] = "en_us" EID.Config["Language"] = "en_us"
local englishName = EID:getObjectName(desc.ObjType, desc.ObjVariant, desc.ObjSubType) local englishName = desc.PermanentTextEnglish or EID:getObjectName(desc.ObjType, desc.ObjVariant, desc.ObjSubType)
EID.Config["Language"] = curLanguage EID.Config["Language"] = curLanguage
if EID.Config["TranslateItemName"] == 1 then if EID.Config["TranslateItemName"] == 1 then
curName = englishName curName = englishName
elseif EID.Config["TranslateItemName"] == 3 and curName ~= englishName and not EID.isDisplayingPermanent then elseif EID.Config["TranslateItemName"] == 3 and curName ~= englishName then
curName = curName.." ("..englishName..")" curName = curName.." ("..englishName..")"
end end
end end
@@ -738,40 +727,31 @@ function EID:renderIndicator(entity)
sprite.Color = Color(1, 1, 1, 1, 0, 0, 0) sprite.Color = Color(1, 1, 1, 1, 0, 0, 0)
EID:renderEntity(entity, sprite, entityPos) EID:renderEntity(entity, sprite, entityPos)
end end
if REPENTANCE then if isMirrorRoom then
if isMirrorRoom then sprite.FlipX = false
sprite.FlipX = false
end
end
end
function EID:ScaleValue(entity)
if entity.Variant == EffectVariant.DICE_FLOOR then
EID.Scale = EID.Config["Size"]
EID.UsedPosition = Vector(EID.Config["XPosition"], EID.Config["YPosition"])
elseif EID.Config["DisplayMode"] == "local" then
EID.Scale = EID.Config["LocalModeSize"]
end end
end end
function EID:PositionLocalMode(entity) function EID:PositionLocalMode(entity)
if EID.Config["DisplayMode"] == "local" then -- don't use Local Mode for descriptions without an entity (or dice floors)
if EID.Config["DisplayMode"] == "local" and entity and entity.Variant ~= EffectVariant.DICE_FLOOR then
EID.Scale = EID.Config["LocalModeSize"]
EID.CurrentScaleType = "LocalModeSize"
local textBoxWidth = EID.Config["LocalModeCentered"] and tonumber(EID.Config["TextboxWidth"])/2 * EID.Scale or -30 local textBoxWidth = EID.Config["LocalModeCentered"] and tonumber(EID.Config["TextboxWidth"])/2 * EID.Scale or -30
local textPosOffset = Vector(-textBoxWidth, 20) local textPosOffset = Vector(-textBoxWidth, 20)
EID:alterTextPos(Isaac.WorldToScreen(entity.Position + textPosOffset)) EID:alterTextPos(Isaac.WorldToScreen(entity.Position + textPosOffset))
if REPENTANCE then if isMirrorRoom then
if isMirrorRoom then EID:alterTextPos(Isaac.WorldToScreen(entity.Position + textPosOffset * Vector(-1,0)))
EID:alterTextPos(Isaac.WorldToScreen(entity.Position + textPosOffset * Vector(-1,0))) local screenCenter = EID:getScreenSize()/2
local screenCenter = EID:getScreenSize()/2 EID.UsedPosition.X = EID.UsedPosition.X - (EID.UsedPosition-screenCenter).X * 2
EID.UsedPosition.X = EID.UsedPosition.X - (EID.UsedPosition-screenCenter).X * 2
end
end end
if entity:ToPickup() and entity:ToPickup():IsShopItem() then if entity:ToPickup() and entity:ToPickup():IsShopItem() then
EID:alterTextPos(Isaac.WorldToScreen(entity.Position + textPosOffset)) EID:alterTextPos(Isaac.WorldToScreen(entity.Position + textPosOffset))
end end
else else
EID.UsedPosition = Vector(EID.Config["XPosition"], EID.Config["YPosition"])
EID.Scale = EID.Config["Size"] EID.Scale = EID.Config["Size"]
EID.CurrentScaleType = "Size"
EID.UsedPosition = Vector(EID.Config["XPosition"], EID.Config["YPosition"])
end end
end end
@@ -803,7 +783,7 @@ local lastMousePos = Vector(0,0)
local lastMouseMove = 0 local lastMouseMove = 0
function EID:handleHoverHUD() function EID:handleHoverHUD()
local mousePos = Isaac.WorldToScreen(Input.GetMousePosition(true)) local mousePos = Isaac.WorldToScreen(Input.GetMousePosition(true)) * 2
if mousePos:Distance(lastMousePos) > 2 then if mousePos:Distance(lastMousePos) > 2 then
lastMousePos = mousePos lastMousePos = mousePos
lastMouseMove = game:GetFrameCount() lastMouseMove = game:GetFrameCount()
@@ -812,12 +792,13 @@ function EID:handleHoverHUD()
return nil return nil
end end
if EID.Config["ShowCursor"] then if EID.Config["ShowCursor"] then
EID.CursorSprite:Render(Vector(mousePos.X, mousePos.Y), nullVector, nullVector) EID.CursorSprite:Render(Vector(mousePos.X / 2, mousePos.Y / 2), nullVector, nullVector)
end end
for k, v in pairs(EID.HUDElements) do for k, v in pairs(EID.HUDElements) do
local hudElement = EID:handleHUDElement(v) local hudElement = EID:handleHUDElement(v)
if hudElement.x <= mousePos.X and (hudElement.x + hudElement.width) >= mousePos.X and hudElement.y <= mousePos.Y and (hudElement.y + hudElement.height) >= mousePos.Y then if hudElement.x <= mousePos.X and (hudElement.x + hudElement.width) >= mousePos.X and hudElement.y <= mousePos.Y and (hudElement.y + hudElement.height) >= mousePos.Y then
return hudElement.descriptionObj() or nil local result = hudElement.descriptionObj()
if result then return result end
end end
end end
return nil return nil
@@ -904,28 +885,30 @@ local function attemptPathfind(entity)
return success return success
end end
local hasShownAchievementWarning = false local hasShownStartWarning = false
local function renderAchievementInfo() local function checkStartOfRunWarnings()
if REPENTANCE and not EID.Config.DisableAchievementCheck and game:GetFrameCount() < 10*30 then if REPENTANCE and not EID.Config["DisableStartOfRunWarnings"] and game:GetFrameCount() < 10*30 then
-- Old Repentance version check; update this to check for the existence of the newest mod API function EID uses -- Old Repentance version check; update this to check for the existence of the newest mod API function EID uses
-- 1.7.6 (Nov. 16, 2021): The Options object (to read the game's options like HUD Offset) -- 1.7.6 (Nov. 16, 2021): The Options object (to read the game's options like HUD Offset)
if Options == nil then if Options == nil then
local demoDescObj = EID:getDescriptionObj(-999, -1, 1) local demoDescObj = EID:getDescriptionObj(-999, -1, 1)
demoDescObj.Name = EID:getDescriptionEntry("AchievementWarningTitle") or "" demoDescObj.Name = EID:getDescriptionEntry("AchievementWarningTitle") or ""
demoDescObj.Description = EID:getDescriptionEntry("OldGameVersionWarningText") or "" demoDescObj.Description = EID:getDescriptionEntry("OldGameVersionWarningText") or ""
EID:displayPermanentText(demoDescObj) EID:displayPermanentText(demoDescObj, "AchievementWarningTitle")
hasShownAchievementWarning = true hasShownStartWarning = true
-- Bag of Crafting modded items check -- Bag of Crafting modded items check
elseif EID.player:HasCollectible(710) and EID:DetectModdedItems() and EID.Config.DisplayBagOfCrafting ~= "never" and (EID.Config.BagOfCraftingDisplayMode == "Recipe List" or EID.Config.BagOfCraftingDisplayMode == "Preview Only") then elseif EID:PlayersHaveCollectible(710) and EID:DetectModdedItems() and EID.Config.DisplayBagOfCrafting ~= "never" and
(EID.Config.BagOfCraftingDisplayMode == "Recipe List" or EID.Config.BagOfCraftingDisplayMode == "Preview Only") then
local demoDescObj = EID:getDescriptionObj(-999, -1, 1) local demoDescObj = EID:getDescriptionObj(-999, -1, 1)
demoDescObj.Name = EID:getDescriptionEntry("AchievementWarningTitle") or "" demoDescObj.Name = EID:getDescriptionEntry("AchievementWarningTitle") or ""
demoDescObj.Description = EID:getDescriptionEntry("ModdedRecipesWarningText") or "" demoDescObj.Description = EID:getDescriptionEntry("ModdedRecipesWarningText") or ""
EID:displayPermanentText(demoDescObj) EID:displayPermanentText(demoDescObj, "AchievementWarningTitle")
hasShownAchievementWarning = true hasShownStartWarning = true
-- Achievements Locked Check (do we have Cube of Meat or Book of Revelations unlocked?) -- Achievements Locked Check (do we have Cube of Meat or Book of Revelations unlocked?)
else else
local characterID = EID.player:GetPlayerType() local characterID = EID.player:GetPlayerType()
--ID 21 = Tainted Isaac. Tainted characters have definitely beaten Mom! (Fixes Tainted Lost's item pools ruining this check) -- ID 21 = Tainted Isaac. Tainted characters have definitely beaten Mom!
-- (Fixes Tainted Lost's item pools, and potentially modded character's mechanics, ruining this check)
if characterID < 21 and game.Challenge == 0 and not EID:PlayersHaveCollectible(CollectibleType.COLLECTIBLE_TMTRAINER) then if characterID < 21 and game.Challenge == 0 and not EID:PlayersHaveCollectible(CollectibleType.COLLECTIBLE_TMTRAINER) then
local hasBookOfRevelationsUnlocked = EID:isCollectibleUnlockedAnyPool(CollectibleType.COLLECTIBLE_BOOK_OF_REVELATIONS or CollectibleType.COLLECTIBLE_BOOK_REVELATIONS) local hasBookOfRevelationsUnlocked = EID:isCollectibleUnlockedAnyPool(CollectibleType.COLLECTIBLE_BOOK_OF_REVELATIONS or CollectibleType.COLLECTIBLE_BOOK_REVELATIONS)
if not hasBookOfRevelationsUnlocked then if not hasBookOfRevelationsUnlocked then
@@ -934,13 +917,13 @@ local function renderAchievementInfo()
local demoDescObj = EID:getDescriptionObj(-999, -1, 1) local demoDescObj = EID:getDescriptionObj(-999, -1, 1)
demoDescObj.Name = EID:getDescriptionEntry("AchievementWarningTitle") or "" demoDescObj.Name = EID:getDescriptionEntry("AchievementWarningTitle") or ""
demoDescObj.Description = EID:getDescriptionEntry("AchievementWarningText") or "" demoDescObj.Description = EID:getDescriptionEntry("AchievementWarningText") or ""
EID:displayPermanentText(demoDescObj) EID:displayPermanentText(demoDescObj, "AchievementWarningTitle")
hasShownAchievementWarning = true hasShownStartWarning = true
end end
end end
end end
end end
elseif hasShownAchievementWarning then elseif hasShownStartWarning then
EID:hidePermanentText() EID:hidePermanentText()
end end
end end
@@ -963,19 +946,23 @@ local function onRender(t)
EID.isDisplaying = false EID.isDisplaying = false
EID:setPlayer() EID:setPlayer()
-- Do not check our hotkeys while a tab that can modify the hotkey is open
if EID.MCMCompat_isDisplayingEIDTab ~= "Visuals" then
-- scale key must be handled before resetting to non-local mode
handleScaleKey()
if Input.IsButtonTriggered(EID.Config["HideKey"], 0) or Input.IsButtonTriggered(EID.Config["HideButton"], EID.player.ControllerIndex) then
EID.isHidden = not EID.isHidden
end
end
EID:PositionLocalMode() -- default to non-local mode to fix MCM / Bag errors
EID.TabPreviewID = 0 EID.TabPreviewID = 0
if Input.IsButtonTriggered(EID.Config["HideKey"], 0) or Input.IsButtonTriggered(EID.Config["HideButton"], EID.player.ControllerIndex) then -- If MCM is open, don't show anything unless we're in a tab labeled as "Visuals" or "Crafting"
EID.isHidden = not EID.isHidden if ModConfigMenu and ModConfigMenu.IsVisible and ModConfigMenu.Config["Mod Config Menu"].HideHudInMenu and EID.MCMCompat_isDisplayingEIDTab ~= "Visuals" and EID.MCMCompat_isDisplayingEIDTab ~= "Crafting" then
end
handleScaleKey()
if ModConfigMenu and ModConfigMenu.IsVisible and ModConfigMenu.Config["Mod Config Menu"].HideHudInMenu and EID.MCMCompat_isDisplayingEIDTab ~= "Visuals" and EID.MCMCompat_isDisplayingEIDTab ~= "Crafting" then --if the mod config menu exists, is opened and Hide Hud is enabled, and ModConfigMenu isn't currently in the "Visuals" or "Crafting" tab of EID
return return
end end
renderAchievementInfo() checkStartOfRunWarnings()
EID:renderMCMDummyDescription() EID:renderMCMDummyDescription()
if EID.GameVersion == "ab+" then if EID.GameVersion == "ab+" then
@@ -985,11 +972,18 @@ local function onRender(t)
EID:removeTextPosModifier("Schoolbag") EID:removeTextPosModifier("Schoolbag")
end end
else else
if EID.player.SubType == 21 or EID.player.SubType == 25 then -- T-Isaac, T-Blue Baby -- Tainted Isaac and Tainted ???
if EID.player.SubType == 21 or EID.player.SubType == 25 then
EID:addTextPosModifier("Tained HUD", Vector(0,30)) EID:addTextPosModifier("Tained HUD", Vector(0,30))
else else
EID:removeTextPosModifier("Tained HUD") EID:removeTextPosModifier("Tained HUD")
end end
-- Magdalene Birthright
if EID.player.SubType == 1 and EID.player:HasCollectible(619) then
EID:addTextPosModifier("18 Heart HUD", Vector(0,5))
else
EID:removeTextPosModifier("18 Heart HUD")
end
end end
if EID.isHidden then if EID.isHidden then
@@ -1008,10 +1002,13 @@ local function onRender(t)
if REPENTANCE and EID.player:HasCollectible(710) then if REPENTANCE and EID.player:HasCollectible(710) then
local success = EID:handleBagOfCraftingRendering() local success = EID:handleBagOfCraftingRendering()
-- If the Bag of Crafting did rendering, don't display any other description
if success then if success then
return return
end end
end end
-- If we're in the Crafting options tab, the only rendering we want to happen is the Bag of Crafting
if EID.MCMCompat_isDisplayingEIDTab == "Crafting" then return end
EID.lastDescriptionEntity = nil EID.lastDescriptionEntity = nil
EID.lastDist = 10000 EID.lastDist = 10000
@@ -1050,14 +1047,13 @@ local function onRender(t)
local closest = EID.lastDescriptionEntity local closest = EID.lastDescriptionEntity
-- if no entity in range, display Sacrifice Room information
if EID.lastDist / 40 > tonumber(EID.Config["MaxDistance"]) then if EID.lastDist / 40 > tonumber(EID.Config["MaxDistance"]) then
if game:GetRoom():GetType() == RoomType.ROOM_SACRIFICE and EID.Config["DisplaySacrificeInfo"] then if game:GetRoom():GetType() == RoomType.ROOM_SACRIFICE and EID.Config["DisplaySacrificeInfo"] then
local curRoomIndex = game:GetLevel():GetCurrentRoomIndex() local curRoomIndex = game:GetLevel():GetCurrentRoomIndex()
local curCounter = EID.sacrificeCounter[curRoomIndex] or 1 local curCounter = EID.sacrificeCounter[curRoomIndex] or 1
local sacrificeDesc = EID:getDescriptionObj(-999, -1, curCounter) local sacrificeDesc = EID:getDescriptionObj(-999, -1, curCounter)
sacrificeDesc.Name = sacrificeDesc.Name.." ("..curCounter.."/12)" sacrificeDesc.Name = sacrificeDesc.Name.." ("..curCounter.."/12)"
EID:alterTextPos(Vector(EID.Config["XPosition"], EID.Config["YPosition"]))
EID.Scale = EID.Config["Size"]
EID:printDescription(sacrificeDesc) EID:printDescription(sacrificeDesc)
end end
return return
@@ -1072,11 +1068,9 @@ local function onRender(t)
--Handle Indicators --Handle Indicators
EID:renderIndicator(closest) EID:renderIndicator(closest)
--Local Mode --Position the description under the entity in Local Mode
EID:PositionLocalMode(closest) EID:PositionLocalMode(closest)
--Scale Value
EID:ScaleValue(closest)
--Handle GetData Entities (specific) --Handle GetData Entities (specific)
if EID.Config["EnableEntityDescriptions"] and EID:getEntityData(closest, "EID_Description") then if EID.Config["EnableEntityDescriptions"] and EID:getEntityData(closest, "EID_Description") then
local desc = EID:getEntityData(closest, "EID_Description") local desc = EID:getEntityData(closest, "EID_Description")
@@ -1100,9 +1094,10 @@ local function onRender(t)
-- force the default glitchy description if option is off -- force the default glitchy description if option is off
if not EID.Config["DisplayGlitchedItemInfo"] then if not EID.Config["DisplayGlitchedItemInfo"] then
glitchedObj.Description = glitchedDesc glitchedObj.Description = glitchedDesc
-- grab the Item Config info if eid_tmtrainer.lua hasn't taken care of it -- grab the Item Config info if eid_tmtrainer.lua hasn't taken care of it, and it hasn't been done before
elseif not debug then elseif not debug and glitchedObj.Description == glitchedDesc then
glitchedObj.Description = EID:CheckGlitchedItemConfig(closest.SubType) .. glitchedDesc EID:addCollectible(closest.SubType, EID:CheckGlitchedItemConfig(closest.SubType) .. glitchedDesc)
glitchedObj = EID:getDescriptionObj(closest.Type, closest.Variant, closest.SubType)
end end
EID:printDescription(glitchedObj) EID:printDescription(glitchedObj)
@@ -1293,6 +1288,11 @@ if EID.MCMLoaded or REPENTANCE then
end end
end end
end end
-- DisableAchievementCheck has been renamed, convert the setting to the new one (this can be removed in a few updates)
if savedEIDConfig["DisableAchievementCheck"] then
EID.Config["DisableStartOfRunWarnings"] = savedEIDConfig["DisableAchievementCheck"]
end
EID.isHidden = EID.Config["InitiallyHidden"] EID.isHidden = EID.Config["InitiallyHidden"]
EID.UsedPosition = Vector(EID.Config["XPosition"], EID.Config["YPosition"]) EID.UsedPosition = Vector(EID.Config["XPosition"], EID.Config["YPosition"])
EID.Scale = EID.Config["Size"] EID.Scale = EID.Config["Size"]
+171 -781
View File
File diff suppressed because it is too large. Load diff