Jump to content

Skye

Members
  • Posts

    197
  • Joined

  • Last visited

Everything posted by Skye

  1. Yes, I understand that, but INSTALL_PVRZ only modifies MOS####.PVRZ files as far as I can tell. You have to update the BAMs with UPDATE_PVRZ_INDICES, which makes sense, but then it should only be a matter of copying the PVRZ file to override with the correct name, so I don't see what the point of that action is. The documentation states: "This function copies the specified PVRZ file into the target folder and updates the PVRZ index." So how is that different from just doing COPY ~MOS1234.PVRZ~ ~override/MOS%new_index%.PVRZ~?
  2. But the whole point is that didn't want want my characters to jump. I know how to do cutscenes with jumps and waits; Jumps are easy. I wanted them to move organically, and jumps are not organic, so everything you've said in this thread is completely besides the point. I was asking for solutions to a very specific problem and you keep trying to tell me how to solve a completely different problem that I don't have any trouble with. I appreciate your input, as always, but unless you can offer a solution to the actual question, then it's just noise.
  3. How is any of that relevant? I know how to trigger the NPCs to go somewhere, but there's no good way of telling when the characters have reached that point within the execution of a single cutscene. I can't tell if you just enjoy playing clueless or if you're just making fun of me. Yeah, but the problem again is that you can only check conditions outside of a cutscene (i.e. within a cutscene lite), which would then require a slew of other triggers and checks just to account for all the nonsense that comes with that. I made it work in perfect conditions, but in reality, conditions are rarely perfect.
  4. Can anyone tell me what the point of the INSTALL_PVRZ action is? Is there relevant metadata written within the zipped PVR files? And why do you need to tell it what the original index was? I thought the page was defined by the filename. I'm just curious as to how this differs from simply copying the file to override with the correct page number in the filename.
  5. The party members could be in any part of the area, so there was no way to know how much time they would need. Jumping to a point helps, but that's not organic movement. The scripting engine simply does not support what I was trying to do and it's not worth jumping through hoops to get it sorta working.
  6. Yeah, I gave up and did pretty much exactly that. I didn't even really bother with fading in and out. I've wasted far too much time trying to get this perfect when it's not even particularly important. At least it was a learning experience, I guess.
  7. Yeah, but that's the problem. I know I can instruct the party members to go somewhere, regardless of whether or not they're actually in the party, but my problem is that I need to know when all of the party members have reached the destination so that I can continue my cutscene. Using Wait isn't good enough because I don't know how long it will take the party to get there and I don't want to leave the cutscene hanging for an arbitrary amount of time if all of the characters are gathered. There's no way to say WaitUntilPartyActionListEmpty(). I tried things with SetCutSceneLite(), but that comes with other problems. The characters no longer walk at consistent speeds since they're not in a real cutscene and then I have to check for every possible condition that could affect how things work. Checking if the characters are standing on a trigger area worked well, but only so long as the conditions are perfect. Sometimes I really hate IE's scripting system. I wish we could just write straight up Lua code for complex stuff...
  8. Jarno, that's of no use to me. Like I said, I don't want my other characters jumping to point, so I can't manage them via ActionOverride. Using MoveToPoint with ActionOverride will not have the party members acting at the same time, so I need multiple blocks. My own idea was actually something similar to what lynx said. I could use SetCutSceneLite and have a separate script manage the characters, which would allow me to check for various triggers in order to verify the characters' position. I was just hoping that there's a better way to wait for the party's action list to clear.
  9. I have a cutscene in which I want the party to move from point A to point B organically (i.e. by walking, not by teleporting). To that end, I made 6 script blocks in the cutscene, so that the whole party can move synchronously, and it works as it's supposed to. The only problem is, I don't know when to continue the cutscene. It should not progress until all party members have completed their movement, but since the party members can be in different parts of the area, I can't just put an arbitrary wait() call in the script and hope that they've all gathered. Is there a good way of doing this? I've got a few ideas on how to go about it, but none of the solutions are ideal.
  10. As lynx said, the only way to do this is to make them a global object (which will register them in the GAM file) and then either convert them to a familiar (change EA to FAMILIAR and then call AddFamiliar) or use MoveGlobalObject to move them around manually via BALDUR*.BCS. Doing this for all summons is not really what you want though and you'd probably need to have unique script names for each of them. Maybe the alternative is to have the creatures increase a global when spawned and decrease it when they die and then resummon them via script when you change areas. But then you'd also have to track the remaining summon time via global counters and they'd get fully healed between areas, so it's not as organic. In other words, it's worth doing for a particular special summon or a new familiar, but if you want to do this for all summons in the game, things get messy.
  11. I was having an issue with a trigger region script, so I added an IF True() ... block into it and, to my surprise, the script fired on every cycle even when no one was standing on the trigger and it even kept firing when I entered a completely different area. Is that normal? Are trigger scripts always being evaluated when you enter a map? It works fine if I replace True() with Entered(), but I have no idea if the script is still firing in the background afterward. Does it break the loop once the condition is false? I just don't want to accidentally have a bunch of scripts running in the background for no reason.
  12. Sounds like a roundabout way of going about it, but it might be easier than doing it by script. I'll give it a shot, thanks.
  13. I've taken the time to look at the specification of BAM v2 files and it seems like a rather simple matter to change the coordinates and size of the data blocks. I'll ask Ken to write us a patch function to automate this process. We've also noticed that there are now TP2 actions that allow you to find an appropriate PVRZ index and update your BAM resources, which will prevent any potential clashes.
  14. Is it possible to have multiple BAM files reuse the same PVRZ file? Looking at existing MOS####.PVRZ files, they all seem to function as texture atlases (sort of), cramming a bunch of different images inside them. I've started using PVRZ-based BAMs in certain cases to make my life easier and to increase image quality, but NearInfinity only allows you to select the index for the MOS file, at least as far as I can tell. Although there a great many indices to choose from, so clashes with other mods are unlikely, I would still prefer it if I could put all my spell icons into one PVRZ for instance.
  15. After a lot of testing and messing around with different opcodes and scripts, I've come to the conclusion that this isn't particularly feasible with the current engine capabilities, short of extending every common script (SHOUT, WTASIGHT, etc.) with additional blocks and messing around with scripting states or something similar. Even then, you can't guarantee consistent results, especially in combination with other mods. It's a shame really, being able to temporarily override a creature's scripts would do wonders for the enchantment school of magic and any other mind-affecting effects, like the taunt ability I originally had in mind. Someday, maybe...
  16. I could find no way to get around these problems, so I've added the relevant ability grants into the respective DPLAYER scripts. I hate padding those for stupid reasons like these, and you can miss the abilities if you play with the AI turned off, but it's better than having broken kits...
  17. I was trying to create a taunt-like ability for one of my classes and I figured recreating something like Morte's litany of curses should be a good start. So I loaded up PsT:EE and looked at the SPL file, whereupon I was immediately presented with several issues. The spell uses opcodes 358 and 369. The latter plays a BAM file and I could probably switch that out for 215 or toss it out altogether. The former, however, sets the override AI script that forces the creature to attack, which is integral to the ability. It doesn't have a resource reference, so I assume it's either hardcoded to SPIN101.BCS or uses the script file named the same as the SPL file. Either way, I imagine this is a replacement for opcode 82 and has the ability to reset the original override script after its duration runs out (otherwise I'm not sure why they would need to make another one). I'm also confused as to why there is a stun with no save effect in there, unless opcode 45 does something else in Ps:T. In any case, replicating the spell has thus far been fruitless. I can't use opcode 82, as that's potentially game-breaking, but I don't see how else to go about this. Any ideas?
  18. I did some additional testing in the hopes of somehow solving the second issue without dirty hacks. I created a new SPL file that grants one of the abilities in question and changed the entry in the CLAB file from GA_ to AP_ for the new spell and it made no difference; the ability was still granted. So then I thought, well maybe the AP_ abilities get reapplied as well and I just haven't noticed, but the static bonuses gained from the other AP_ abilities did not increase after the companion rejoined. I said okay, maybe only the first row in the 2DA doesn't get reapplied, but after changing the order, it still made no difference. Finally, I figured I just messed something up. I might have had a script or something somewhere that granted the ability and I've just forgotten about it. So, I deleted the entry for the ability from the CLAB file, asked the NPC to rejoin and.... nothing; The CLAB table does indeed control this ability being applied upon rejoin. I am completely baffled by this. By what bizarre logic does the game apply the values from the CLAB table and why in the hell does it happen upon rejoin and not just upon leveling up? How do I even begin fixing this in any meaningful way that doesn't involve monitoring all six party members on every cycle and jumping through hoops to remove the abilities (since there is no script action to do so).
  19. I don't know if this is something I've simply never noticed (despite my extensive playtesting) or if things have changed in recent versions of the EE engine but there seems to be a lot of baggage connected to companions leaving and rejoining the party now and it's wreaking havoc on my mods. Namely, I've experienced two major issues. The first is that the companion's custom script gets reset. Was PARTYAI.2DA always a thing? It seems to have been around since at least v2.1, but I don't recall this ever being an issue before. Has the behavior changed? I kinda get why one would want to set a default Class script on first join if one is missing, but after that it's just extra work for the player. Is there any way around this behavior? I've sorta fixed this by adding entries to the table, so that it doesn't default to nothing, but that's not really what I want. The second problem is that all the class/kit abilities get re-granted to the character. I've made several kits that have single-use abilities granted to them at certain levels. They can't be applied abilities because the player has to choose their effect. I can't for the life of me figure out why the game engine would want to re-grant those abilities after the companion rejoins, but it completely opens up my kits to abuse and I'm not really sure how to tackle this problem (aside from adding a bunch of script blocks to check for weird game behavior). There are probably more issues that I've yet to discover, but I can only tackle one headache at a time (or two, as it were). Any advice would be more than welcome.
  20. No, neither CHAIN, nor any of the INTERJECTs, support a state list. Hence why I was asking if there's a way to do it which is not apparent. And yeah, I know the dialog still works, but it's not "clean" and that bothers us. In the end, we added the proper states (with no extra transitions) to the dialog manually and used EXTEND_BOTTOM, which does support a state list, in order to link to those states. If there is a better (or shorter) way to do it, we haven't been able to find it. If anyone can share some more insight on the matter, I'd love to hear it though.
  21. Ken and I have been playing around with interjections a lot lately and I've noticed a peculiar issue that I could use some help with since neither of us can explain it. I've chosen a random situation where our NPC interjects Shoal as she asks for a kiss and simplified the example for the sake of brevity. INTERJECT SHOAL 1 InterjectShoal == MYNPCJ IF ~IsGabber("MyNPC")~ THEN @1 DO ~Something()~ = @2 DO ~SomethingElse()~ EXIT As expected, that adds a forced transition with the global and the custom trigger to the dialog. The strange part is that after @1, the dialog should immediately transition into @2, but instead, weidu adds two transitions, one of which is a dead end and exits and the other goes to @2, but has the IsGabber() trigger repeated for some reason. Again, simplified for brevity: IF ~~ THEN BEGIN N SAY #1 IF ~~ THEN DO ~Something()~ EXIT IF ~IsGabber("MyNPC")~ THEN DO ~Something()~ GOTO N+1 END IF ~~ THEN BEGIN N+1 SAY #2 IF ~~ THEN DO ~SomethingElse()~ EXIT END What are we missing here? Are the initial triggers supposed to be repeated for every step of the chain? Why would that be? And why create an exit transition after the first one in a chain? On a side note, is there a way to add the same interjection to multiple states without copy pasting it?
  22. Yeah, that's exactly what I did. And the first thing I tried after testing it was if I could pause the game and drop the items before the script fires and I had no trouble doing so. The disconnect between the two events isn't really something I'm comfortable with. It should be just fine in practice, but the perfectionist in me is struggling really hard with introducing an obvious exploit into the mod. Also the fact that the same triggers from the area script and the dialog file work differently is entirely mind-boggling to me. It's always one step forward, two steps back...
  23. Firing the actions from an area script does seem to work well enough. I did encounter one issue, however. When I use the trigger NumItemsPartyGT() from an area script, it doesn't seem to be able to detect items from bags, whereas the same trigger has no issue when used in a conversation. Since there's obviously a delay between ending a conversation and triggering the area script, I need this check to work if I want to avoid shenanigans from players. Any ideas?
  24. Hrm, I haven't actually tried that. I've never seen any of the smiths do that either. As far as I know, they all take and destroy your items via conversation actions. I'll take it under consideration. It would certainly make my dialog files cleaner, although maintenance becomes a bit more of a chore with split files.
  25. Is there an easier way to destroy items taken from player inventory via script than calling DestroyItem() for every single instance? The problem I have is the following: Let's say I want an NPC to accept a stack of items, for instance 10 sunstone gems. Doing that is simple enough by using TakePartyItemNum("MISC18",10). The issue here is that every single gem is taken individually and ends up occupying its own inventory slot (which is a problem in and of itself but whatever), meaning that if I call DestroyItem("MISC18") immediately after, it will only destroy one gemstone and the other 9 will still be occupying the slots. Is there a way to avoid having to call DestroyItem() ten times in a row? I know that one option would be to create an invisible creature, have it take the items and destroy itself, but I was just wandering if there's a better way.
×
×
  • Create New...