v44.2-v47 commit build testing #1028
Replies: 17 comments 4 replies
-
|
btw i have the same qt mod that works where i was able to see the red qt clones bot or no botplay and i'm planning to go back and download 6 js versions to try and identify where it stops happening. this isn't a big consern with modding but still i'm curious in what caused it to stop happening with ghosts while it works for the shadow scripts you can also ignore the rest of the script, shader, and function names |
Beta Was this translation helpful? Give feedback.
-
|
interesting, tried v40 and got the rare Christmas theme. also the ghosts in v40 work perfectly. no problems at all (mod or no mod | bot or no bot presses) seems like i'm at a good start, i'm going up 1 version until it stops working |
Beta Was this translation helpful? Give feedback.
-
|
As I expected, OG ghost script and my method for making ghosts stopped working when you added extra keys (show script still works ofc) Ghosts work list: |
Beta Was this translation helpful? Give feedback.
-
|
I've ignored the ghost script problem because it's not a big deal, but then when using the following lua script, it still worked and loaded but parts of it broke: --scripts by NTH208 stageChoose = 1 local composerTXT = { function onCreatePost() makeAnimatedLuaSprite('back', 'fpmenu/background', -110, 0); scaleObject('stageBox',1.05,1.05) scaleObject('threatLevel',1.05,1.05) scaleObject('threatBarBG',1.05,1.05) scaleObject('stageBoxFake',0.55,0.55) scaleObject('stageBoxFake2',0.55,0.55) scaleObject('arrows',4,4) end |
Beta Was this translation helpful? Give feedback.
-
|
Wait could you try to do this on ALL action builds between 1.44.2 and 1.45.0? |
Beta Was this translation helpful? Give feedback.
-
|
im in the middle of modding rn, if i remember ill do it in a hour or 2 |
Beta Was this translation helpful? Give feedback.
-
|
v45 broke the ghosts but i didn't test if it was the reason why part of the hscript didn't work |
Beta Was this translation helpful? Give feedback.
-
|
v44.2: works i think editing the tweenscale broke this script |
Beta Was this translation helpful? Give feedback.
-
|
ill get to the ghost breaking part (commits v44.2-v45) in an hour-tomorrow) |
Beta Was this translation helpful? Give feedback.
-
Beta Was this translation helpful? Give feedback.
-
|
i try to download it but it just shows the files changed and only mainly allows be to download the zip with the source code instead of the small changes applied to the zip can you try something like codename engine where you can list the actions that contain releases? |
Beta Was this translation helpful? Give feedback.
-
|
Ghost Testing (idk why it's using psych engine links): Build ShadowMario#1338 (Song Resync Final Fix): No every time i try the ghost scripts they just crash on all these versions and I don't want to do this for another hour BUILD ShadowMario#1329 (2 CHARACTERS): YES, GHOSTS WORK |
Beta Was this translation helpful? Give feedback.
-
Beta Was this translation helpful? Give feedback.
-
|
Also, did you make sure to extract every build before running |
Beta Was this translation helpful? Give feedback.
-
|
FINNAL ANSWER: Stopped working when song resyncing fully fixed (this doesn't mean the song timer is the reason why since the ghosts still work for manual hits) Ghosts work for https://github.com/JordanSantiagoYT/FNF-JS-Engine/actions/runs/13820380996 Ghosts don't work for https://github.com/JordanSantiagoYT/FNF-JS-Engine/actions/runs/13826753328 |
Beta Was this translation helpful? Give feedback.
-
|
wait i was gonna ask if you also have the option turned on where hits don't call goodNoteHit but that's an automatic nope since it is working on manual hits |
Beta Was this translation helpful? Give feedback.
-
|
on any song on default settings and modifiers the opponent + botplay ghost only happens once, if it was overall then i would think it could be the changing song position method but then that doesn't make sense because it works for manual hits (i mainly test it first on 2hot hard-mode and even tho it's hard to see, i can see the hx icon replace playable pico on all builds up until that one), i feel like it has something to do with song positioning and syncing since it's the update/syncing edits that caused it but then again ghosts do still work, it's just it only happens once for opponent |
Beta Was this translation helpful? Give feedback.




Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
function pneumonoultramicroscopicsilicovolcanoconiosis_updateNoteData()
number = 0
noteX = {}
noteY = {}
local noteCount = getProperty('strumLineNotes.length')
for i = 0, noteCount - 1 do
local noteXVal = getPropertyFromGroup('strumLineNotes', i, 'x')
local noteYVal = getPropertyFromGroup('strumLineNotes', i, 'y')
noteX[i] = noteXVal
noteY[i] = noteYVal
end
end
function pneumonoultramicroscopicsilicovolcanoconiosis_noteTween()
local noteCount = getProperty('strumLineNotes.length')
for i = 0, noteCount - 1 do
if noteX[i] ~= nil and noteY[i] ~= nil then
local newX = math.random(noteX[i] - 10, noteX[i] + 10)
local newY = math.random(noteY[i] - 10, noteY[i] + 10)
noteTweenX('glitchNoteX_'..i, i, newX, 0.01, 'backInOut')
noteTweenY('glitchNoteY_'..i, i, newY, 0.01, 'backInOut')
end
end
end
function pneumonoultramicroscopicsilicovolcanoconiosis_ghostCreations(char)
local songPos = getSongPosition()
local ghostName = char..'Ghost'..songPos
makeAnimatedLuaSprite(ghostName, getProperty(char..'.imageFile'), getProperty(char..'.x'), getProperty(char..'.y'))
addLuaSprite(ghostName, false)
setProperty(ghostName..'.scale.x', getProperty(char..'.scale.x'))
setProperty(ghostName..'.scale.y', getProperty(char..'.scale.y'))
setProperty(ghostName..'.flipX', getProperty(char..'.flipX'))
local colorArray = getProperty(char..'.healthColorArray')
local hexColor = string.format('%.2x%.2x%.2x', colorArray[1], colorArray[2], colorArray[3])
setProperty(ghostName..'.color', getColorFromHex(hexColor))
setProperty(ghostName..'.alpha', 1)
setProperty(ghostName..'.animation.frameName', _G[char..'GhostData.frameName'])
setProperty(ghostName..'.offset.x', _G[char..'GhostData.offsetX'])
setProperty(ghostName..'.offset.y', _G[char..'GhostData.offsetY'])
setObjectOrder(ghostName, getObjectOrder(char..'Group')-1)
doTweenAlpha(ghostName..'delete', ghostName, 0, 0.5, 'linear', function()
if objectExists(ghostName) then
removeLuaSprite(ghostName, true)
end
end)
end
function pneumonoultramicroscopicsilicovolcanoconiosis_ghostData(char)
_G[char..'GhostData.frameName'] = getProperty(char..'.animation.frameName')
_G[char..'GhostData.offsetX'] = getProperty(char..'.offset.x')
_G[char..'GhostData.offsetY'] = getProperty(char..'.offset.y')
end
function onCreate()
clearEffects('camHud', true)
clearEffects('camGame', true)
clearEffects('camOther', true)
addVCREffect('camHud', false)
addVCREffect('camGame', false)
addVCREffect('camOther', true)
addBlockedGlitchEffect('camHud', true)
addBlockedGlitchEffect('camGame', true)
addBlockedGlitchEffect('camOther', true)
end
function onCreatePost()
clearEffects('camHud', true)
clearEffects('camGame', true)
clearEffects('camOther', true)
addVCREffect('camHud', false)
addVCREffect('camGame', false)
addVCREffect('camOther', true)
addBlockedGlitchEffect('camHud', true)
addBlockedGlitchEffect('camGame', true)
addBlockedGlitchEffect('camOther', true)
end
function onSongStart()
pneumonoultramicroscopicsilicovolcanoconiosis_updateNoteData()
clearEffects('camHud', true)
clearEffects('camGame', true)
clearEffects('camOther', true)
addVCREffect('camHud', false)
addVCREffect('camGame', false)
addVCREffect('camOther', true)
addBlockedGlitchEffect('camHud', true)
addBlockedGlitchEffect('camGame', true)
addBlockedGlitchEffect('camOther', true)
end
function opponentNoteHit(id, direction, noteType, isSustainNote)
clearEffects('camHud', true)
clearEffects('camGame', true)
clearEffects('camOther', true)
number = number + 1
if direction == 0 then
noteTweenAngle('E', 0 , 360 * number, 0.1, linear)
end
if direction == 1 then
noteTweenAngle('F', 1 , 360 * number, 0.1, linear)
end
if direction == 2 then
noteTweenAngle('G', 2 , 360 * number, 0.1, linear)
end
if direction == 3 then
noteTweenAngle('H', 3 , 360 * number, 0.1, linear)
end
if _G['dadGhostData.strumTime'] == getPropertyFromGroup('notes', id, 'strumTime') and not isSustainNote then
clearEffects('camHud', true)
clearEffects('camGame', true)
clearEffects('camOther', true)
cameraShake('camHud',0.01,0.2)
cameraShake('camOther',0.01,0.2)
pneumonoultramicroscopicsilicovolcanoconiosis_noteTween()
pneumonoultramicroscopicsilicovolcanoconiosis_ghostCreations('dad')
end
if not isSustainNote then
clearEffects('camHud', true)
clearEffects('camGame', true)
clearEffects('camOther', true)
_G['dadGhostData.strumTime'] = getPropertyFromGroup('notes', id, 'strumTime')
pneumonoultramicroscopicsilicovolcanoconiosis_ghostData('dad')
end
clearEffects('camHud', true)
clearEffects('camGame', true)
clearEffects('camOther', true)
addVCREffect('camHud', false)
addVCREffect('camGame', false)
addVCREffect('camOther', true)
addBlockedGlitchEffect('camHud', true)
addBlockedGlitchEffect('camGame', true)
addBlockedGlitchEffect('camOther', true)
end
function goodNoteHit(id, direction, noteType, isSustainNote)
if _G['boyfriendGhostData.strumTime'] == getPropertyFromGroup('notes', id, 'strumTime') and not isSustainNote then
pneumonoultramicroscopicsilicovolcanoconiosis_ghostCreations('boyfriend')
end
if _G['gfGhostData.strumTime'] == getPropertyFromGroup('notes', id, 'strumTime') and not isSustainNote then
pneumonoultramicroscopicsilicovolcanoconiosis_ghostCreations('gf')
end
if not isSustainNote then
_G['boyfriendGhostData.strumTime'] = getPropertyFromGroup('notes', id, 'strumTime')
pneumonoultramicroscopicsilicovolcanoconiosis_ghostData('boyfriend')
_G['gfGhostData.strumTime'] = getPropertyFromGroup('notes', id, 'strumTime')
pneumonoultramicroscopicsilicovolcanoconiosis_ghostData('gf')
end
end
everything here except for when botplay is enabled works perfectly. it's 4 scripts into one and both this method and older ghost method stopped working with botplay completely at some point
OG:
function getIconColor(chr)
return getColorFromHex(rgbToHex(getProperty(chr .. ".healthColorArray")))
end
function rgbToHex(array)
return string.format('%.2x%.2x%.2x', array[1], array[2], array[3])
end
function goodNoteHit(id, direction, noteType, isSustainNote)
if _G['boyfriendGhostData.strumTime'] == getPropertyFromGroup('notes', id, 'strumTime') and not isSustainNote then
createGhost('boyfriend')
end
if _G['gfGhostData.strumTime'] == getPropertyFromGroup('notes', id, 'strumTime') and not isSustainNote then
createGhost('gf')
end
if not isSustainNote then
_G['boyfriendGhostData.strumTime'] = getPropertyFromGroup('notes', id, 'strumTime')
updateGData('boyfriend')
end
if not isSustainNote then
_G['gfGhostData.strumTime'] = getPropertyFromGroup('notes', id, 'strumTime')
updateGData('gf')
end
end
function opponentNoteHit(id, direction, noteType, isSustainNote)
if _G['dadGhostData.strumTime'] == getPropertyFromGroup('notes', id, 'strumTime') and not isSustainNote then
createGhost('dad')
end
if not isSustainNote then
_G['dadGhostData.strumTime'] = getPropertyFromGroup('notes', id, 'strumTime')
updateGData('dad')
end
end
function createGhost(char)
songPos = getSongPosition() --in case game stutters
makeAnimatedLuaSprite(char..'Ghost'..songPos, getProperty(char..'.imageFile'),getProperty(char..'.x'),getProperty(char..'.y'))
addLuaSprite(char..'Ghost'..songPos, false)
setProperty(char..'Ghost'..songPos..'.scale.x',getProperty(char..'.scale.x'))
setProperty(char..'Ghost'..songPos..'.scale.y',getProperty(char..'.scale.y'))
setProperty(char..'Ghost'..songPos..'.flipX', getProperty(char..'.flipX'))
setProperty(char..'Ghost'..songPos..'.color', getIconColor(char))
setProperty(char..'Ghost'..songPos..'.alpha', 1)
doTweenAlpha(char..'Ghost'..songPos..'delete', char..'Ghost'..songPos, 0, 0.6)
setProperty(char..'Ghost'..songPos..'.animation.frameName', _G[char..'GhostData.frameName'])
setProperty(char..'Ghost'..songPos..'.offset.x', _G[char..'GhostData.offsetX'])
setProperty(char..'Ghost'..songPos..'.offset.y', _G[char..'GhostData.offsetY'])
setObjectOrder(char..'Ghost'..songPos, getObjectOrder(char..'Group')-1)
end
function onTweenCompleted(tag)
if (tag:sub(#tag- 5, #tag)) == 'delete' then
removeLuaSprite(tag:sub(1, #tag - 6), true)
end
end
function updateGData(char)
_G[char..'GhostData.frameName'] = getProperty(char..'.animation.frameName')
_G[char..'GhostData.offsetX'] = getProperty(char..'.offset.x')
_G[char..'GhostData.offsetY'] = getProperty(char..'.offset.y')
end
there's this lua script that uses tags aswell and makes "shadows" but compared to the ghost method where it makes 1 then stops, it works perfectly (unless ofc there's bambi songs which my method handles using song timer and is mainly inf loop counting and/or get/set property only)
-- This script made by BillyLOLwkwk
-- dont ever change this variable from path to cooldown
local path = ''
local scale = 0
local boyX = 0
local boyY = 0
local flipX = false
local anim = {}
local x = 0
local ofs = {}
local fps = {}
local cooldown = {false, false, false, false}
-- you can change this one to custom it yourself
local shadow = true -- true if you want turn on the shadow and false if you want turn it off
local range = 50 -- for the shadow range
local duration = 1 -- for how long the shadow still
function startWith(text, prefix)
return text:find(prefix,1,true) == 1
end
function updateShadow()
-- don't be gay >:]
path = getProperty('dad.imageFile')
scale = getProperty('dad.jsonScale')
boyX = getProperty('dad.x')
boyY = getProperty('dad.y')
flipX = getProperty('dad.originalFlipX')
for x = 0, getProperty('dad.animationsArray.length')-1 do
if getPropertyFromGroup('dad.animationsArray', x, 'anim') == 'singLEFT' then
anim[1] = getPropertyFromGroup('dad.animationsArray', x, 'name')
ofs[1] = getPropertyFromGroup('dad.animationsArray', x, 'offsets')[1]
ofs[2] = getPropertyFromGroup('dad.animationsArray', x, 'offsets')[2]
fps[1] = getPropertyFromGroup('dad.animationsArray', x, 'fps')
end
if getPropertyFromGroup('dad.animationsArray', x, 'anim') == 'singDOWN' then
anim[2] = getPropertyFromGroup('dad.animationsArray', x, 'name')
ofs[3] = getPropertyFromGroup('dad.animationsArray', x, 'offsets')[1]
ofs[4] = getPropertyFromGroup('dad.animationsArray', x, 'offsets')[2]
fps[2] = getPropertyFromGroup('dad.animationsArray', x, 'fps')
end
if getPropertyFromGroup('dad.animationsArray', x, 'anim') == 'singUP' then
anim[3] = getPropertyFromGroup('dad.animationsArray', x, 'name')
ofs[5] = getPropertyFromGroup('dad.animationsArray', x, 'offsets')[1]
ofs[6] = getPropertyFromGroup('dad.animationsArray', x, 'offsets')[2]
fps[3] = getPropertyFromGroup('dad.animationsArray', x, 'fps')
end
if getPropertyFromGroup('dad.animationsArray', x, 'anim') == 'singRIGHT' then
anim[4] = getPropertyFromGroup('dad.animationsArray', x, 'name')
ofs[7] = getPropertyFromGroup('dad.animationsArray', x, 'offsets')[1]
ofs[8] = getPropertyFromGroup('dad.animationsArray', x, 'offsets')[2]
fps[4] = getPropertyFromGroup('dad.animationsArray', x, 'fps')
end
end
end
function onCreatePost()
updateShadow()
end
function opponentNoteHit(a,b,c,d)
if shadow and (d == false or (d == true and cooldown[b+1])) then
local tag = 'shadowdad'..tostring(x)
makeAnimatedLuaSprite(tag, path, boyX, boyY)
addAnimationByPrefix(tag, 'act', anim[b+1], fps[b+1], false)
addLuaSprite(tag, false)
setObjectOrder(tag, getObjectOrder('dadGroup')-1)
setProperty(tag ..'.alpha', 0.35)
doTweenAlpha(tag..'alpha', tag, 0, duration, easeOut)
setProperty(tag..'.offset.x', ofs[b2+1])
setProperty(tag..'.offset.y', ofs[b2+2])
setProperty(tag..'.scale.x', scale)
setProperty(tag..'.scale.y', scale)
setProperty(tag..'.flipX', flipX)
objectPlayAnimation(tag, 'act', true)
cooldown[b+1] = false
if b == 0 then
doTweenX(tag, tag, boyX - range, duration, easeOut)
runTimer('dad_left', duration/53)
end
if b == 1 then
doTweenY(tag, tag, boyY + range, duration, easeOut)
runTimer('dad_down', duration/53)
end
if b == 2 then
doTweenY(tag, tag, boyY - range, duration, easeOut)
runTimer('dad_up', duration/53)
end
if b == 3 then
doTweenX(tag, tag, boyX + range, duration, easeOut)
runTimer('dad_right', duration/53)
end
x = x + 1
end
end
function onTweenCompleted(tag)
if startwith(tag, 'shadowdad') then
removeLuaSprite(tag, true)
end
end
function onTimerCompleted(tag)
if tag == 'dad_left' then
cooldown[1] = true
end
if tag == 'dad_down' then
cooldown[2] = true
end
if tag == 'dad_up' then
cooldown[3] = true
end
if tag == 'dad_right' then
cooldown[4] = true
end
end
function onEvent(n,v1,v2)
if n == "Edit Shadow" and v1 == 'dad' then
if v2 == 'true' then
shadow = true
else
shadow = false
end
end
if n == 'Edit Shadow Range' and v1 == 'dad' then
if tonumber(v2) > 0 then
range = tonumber(v2)
else
range = 50
end
end
if n == 'Edit Shadow Duration' and v1 == 'dad' then
if tonumber(v2) > 0 then
duration = tonumber(v2)
else
duration = 1
end
end
if n == "Change Character" then
updateShadow()
end
end
(it's only for dad).
tho then again, when i turn on botplay, the ghosts also stop working even though it's using tag. but the shadows still work perfectly (movement or no movement)
Beta Was this translation helpful? Give feedback.
All reactions