-
Content Count
1,563 -
Joined
-
Last visited
-
Days Won
135
Content Type
Profiles
Forums
Blogs
Forum & Tracker Requests
Downloads
Gallery
Store
Calendar
Everything posted by JCarter426
-
No, it... those are two different things. There are some areas with just corrupted walkmesh data. There's a tiny bit that counts as a walkable point, even though it's not connected to anything else. As far as I'm aware it's not actually part of any room's walkmesh - probably just garbage data. But it happens with a lot of modules, not just Telos. And it's usually far below the rest of the module. One example is 950COR. It's possible to teleport into the skybox and for some reason HK-47 is hanging out there. As for the second thing, what I mean is that when you spawn a creature it spawns in at the nearest possible location. So if you spawn one, for example, a meter below the floor, it will usually spawn it on the floor. It ignores the Z value you input because there's no walkmesh there, instead getting the nearest workable location. Generally this location has the correct X and Y value, but if you try to spawn something inside a wall or another object or whatever, it will similarly be displaced along those axes. So if you spawn a creature with an extreme negative Z value, there's a chance it will end up at one of those weird points instead of any legitimate coordinates. But it's highly dependent on the module. I don't want to change the direction the camera's facing, though... that would probably be more distracting. I'd only want to get the direction, and as far as I'm aware there is no such function.
-
It works with some modules. The walkmesh is a bit wonky at points, and it's possible to teleport to locations outside the main area, usually far below it. Even if it doesn't work, the game should ignore the Z value in such a case but not the X or Y so it wouldn't hurt to try. There is one other problem though. It's possible to have the camera facing in a different direction than the player is.
-
Yeah, I might try that... Maybe cycle through each creature until there's no line of sight, and if that doesn't work spawn behind the player outside their field of vision, with an extreme negative Z value to try to force them below the module if possible.
-
Under the module might work... I'm not sure if it would work with every module, though. I thought about doing it in relation to the player's location, but the problem is there's still no way to tell where in the module the player is. To spawn them outside of the player's field of vision, right? The problem is if the player is at the very edge of the module and facing towards the other end, there is nowhere behind the player and the creature could end up spawning right next to them. Then again, the creature only has to exist for a fraction of a second, so it's not a huge issue. And it's possible to put in a few different options, depending on what works best. For example, getting the location of whatever object is farthest away from the player, and if that's not far enough away then to try some other option.
-
Yay! That's probably the first time a script ever worked on the first try in the history of everything ever. There's still the matter of retaining the head, but I haven't had any new ideas on that front. It's really a critical flaw that DuplicateHeadAppearance requires objects and can't do with just numbers.
-
There are notes in the script, but I can summarize. First you go down to the open variables section: string sItemBase = "jc_d_test"; string sScript = ""; int nCheckHead = TRUE; int nCheckGender = TRUE; int nCheckPheno = FALSE; int nSlot = 1; int nB = 64; (those are all the open variables, don't change any others unless you know what you're doing) and change the item name from "jc_d_test" to whatever you want your item to be called (12 characters or fewer). You make an item with this name and tag, and the description you want and so on, but with no disguise property on the item. Let's say I change this to "jc_example". Then set the gender and phenotype booleans based on how you want the appearance to vary. By default, only gender is enabled, since K2 doesn't use phenotype. Then you duplicate this item to apply the disguise property you want, changing the item's tag, template, and file name. The naming convention is the original item base name, plus a suffix for gender and phenotype. If you just want a male version and a female version, then going by my example, the new items would be "jc_example_m" and "jc_example_f". If you are using phenotype as well, then you would have "jc_example_m_s" and "jc_example_f_m" for male, small and female, medium, and so on. A full list would be: jc_example jc_example_m_s jc_example_m_m jc_example_m_l jc_example_f_s jc_example_f_m jc_example_f_l If you set both gender and phenotype to false, then the disguise item should have the suffix "_d" instead; in my example this would be "jc_example_d". You can also change the inventory slot the item will use. By default I've gone with armor, but you could change this to a mask or whatever. I've included an index in the script comments. The last one is the local boolean that's used to check if the creature has put the item on or not. I've left this as an open variable for compatibility reasons but you shouldn't need to change it. So change those and only those, then save it. Then execute it through the heartbeat script like this: //:: k_hen_heartbt01 /* Heartbeat for the non-active party members. */ //:: Created By: //:: Copyright (c) 2002 Bioware Corp. #include "k_inc_debug" #include "k_inc_switch" void main() { ExecuteScript("k_ai_master", OBJECT_SELF, KOTOR_HENCH_EVENT_ON_HEARTBEAT); /* object oEnemy = GetNearestCreature(CREATURE_TYPE_PERCEPTION, PERCEPTION_SEEN, OBJECT_SELF, 1, CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY); //GN_SetSpawnInCondition(SW_FLAG_SHOUTED_AT, FALSE); if(!GN_GetSpawnInCondition(SW_FLAG_AI_OFF) && !GetSoloMode()) { if(GetPartyMemberByIndex(0) != OBJECT_SELF) { if(IsObjectPartyMember(OBJECT_SELF) && //Note that this check replaces GetIsObjectValid(oMaster) //GetCurrentAction(OBJECT_SELF) != ACTION_FOLLOW && GetCurrentAction(OBJECT_SELF) != ACTION_MOVETOPOINT && //GetCurrentAction(OBJECT_SELF) != ACTION_WAIT && GetCurrentAction(OBJECT_SELF) != ACTION_FOLLOWLEADER && !GetIsConversationActive() && //GetDistanceBetween(OBJECT_SELF, GetPartyMemberByIndex(0)) > 4.5 && !GN_GetSpawnInCondition(SW_FLAG_SPECTATOR_STATE) && GetCommandable()) { //Db_PostString(GetTag(OBJECT_SELF) + " HEARTBEAT CHECK 1 PASS", 4, 10, 2.0); if(!GN_GetIsFighting(OBJECT_SELF) && !GetIsObjectValid(oEnemy)) { //Db_PostString(GetTag(OBJECT_SELF) + " HEARTBEAT CHECK 2 PASS", 4, 12, 2.0); //The distance checking is now down in the script fired from AI Action Update - Leave 5m Radius of party leader. ClearAllActions(); ActionFollowLeader(); } } } } ... else if(GetSoloMode() && GetCurrentAction(OBJECT_SELF) == ACTION_FOLLOWLEADER) { ClearAllActions(); } if(GN_GetSpawnInCondition(SW_FLAG_EVENT_ON_HEARTBEAT)) { SignalEvent(OBJECT_SELF, EventUserDefined(1001)); } */ ExecuteScript("jc_d_test", OBJECT_SELF, -1); } ...replacing "jc_d_test" with your script name, of course. Recompile k_hen_heartbt01 and you should be all set.
-
I did some testing that answered a few questions I had. And I've confirmed that my convoluted head process should work. The spawning procedure is still needed for the initial appearance change, though. And I've yet to determine the best way of spawning the creature somewhere the player won't be able to see them. Every module's coordinates different, so I'm not sure how to go about this. Also it would probably be unavoidable in small modules anyway. As such, I decided not to write the head duplicating function yet. The following code should work work for masks and such, however: /* jc_d_test K2 VERSION This allows for the extension of body model slots through the use of disguise items. When the item is equipped, the heartbeat script will replace that item with a copy that has the desired disguise property. The disguise effect can vary based on the user's gender and phenotype. The character may also retain their original head or be given a new one through the disguise; however, this has not yet been implemented. In the K2 version of the script, feedback is hidden, phenotype is disabled by default, and everything is contained in in one script. */ // This sets the string for gender string JC_SET_GENDER(object oUser) { /* 0 = Male 1 = Female 2 = Both 3 = Other 4 = None */ string sGender; int nGender = GetGender(oUser); if(nGender == 0 ) sGender = "_m"; else if(nGender == 1 ) sGender = "_f"; else if(nGender == 2 ) sGender = "_m"; else if(nGender == 3 ) sGender = "_m"; else if(nGender == 4 ) sGender = "_m"; else sGender = "_m"; return sGender; } // This sets the string for phenotype string JC_SET_PHENO(object oUser) { /* Small - Scoundrel, Jedi Consular, Jedi Master, Sith Lord Medium - Scout, Jedi Sentinel, Jedi Watchman, Sith Assassin, and default Large - Soldier, Jedi Guardian, Jedi Weapon Master, Sith Marauder */ string sPheno; int nClass = GetClassByPosition(1, oUser); if( nClass == 0 || nClass == 3 || nClass == 11 || nClass == 14 ){ sPheno = "_l"; } else if( nClass == 2 || nClass == 4 || nClass == 12 || nClass == 15 ){ sPheno = "_s"; } else sPheno = "_m"; return sPheno; } // This cycles through the inventory to replace disguise items with the dummy item. void JC_SWAP_INVENTORY_CYCLE(string sItemBase, string sDisguise, object oUser) { object oItem = GetFirstItemInInventory(oUser); while( oItem != OBJECT_INVALID ) { string sTag = GetTag(oItem); if( sTag == sDisguise ) { DestroyObject(oItem, 0.0, TRUE, 0.0, TRUE); CreateItemOnObject(sItemBase, oUser, 1, TRUE); } oItem = GetNextItemInInventory(oUser); } } //This just runs the above subroutine for every possible disguise item name. void JC_SWAP_INVENTORY(string sItemBase, object oUser ){ JC_SWAP_INVENTORY_CYCLE(sItemBase, sItemBase + "_m", oUser); JC_SWAP_INVENTORY_CYCLE(sItemBase, sItemBase + "_m" + "_s", oUser); JC_SWAP_INVENTORY_CYCLE(sItemBase, sItemBase + "_m" + "_m", oUser); JC_SWAP_INVENTORY_CYCLE(sItemBase, sItemBase + "_m" + "_l", oUser); JC_SWAP_INVENTORY_CYCLE(sItemBase, sItemBase + "_f", oUser); JC_SWAP_INVENTORY_CYCLE(sItemBase, sItemBase + "_f" + "_s", oUser); JC_SWAP_INVENTORY_CYCLE(sItemBase, sItemBase + "_f" + "_m", oUser); JC_SWAP_INVENTORY_CYCLE(sItemBase, sItemBase + "_f" + "_l", oUser); JC_SWAP_INVENTORY_CYCLE(sItemBase, sItemBase + "_s", oUser); JC_SWAP_INVENTORY_CYCLE(sItemBase, sItemBase + "_l", oUser); JC_SWAP_INVENTORY_CYCLE(sItemBase, sItemBase + "_d", oUser); } void JC_SWAP_EQUIP(string sDisguise, int nSlot, object oUser, string sScript) { int nGame = 2; object oEquip = GetItemInSlot(nSlot, oUser); ActionUnequipItem(oEquip, TRUE); DestroyObject(oEquip, 0.0, TRUE, 0.0, TRUE); object oItem = CreateItemOnObject(sDisguise, oUser, 1, TRUE); if( nGame == 1 ) { CreateItemOnObject(sDisguise, oUser, 1, TRUE); ExecuteScript(sScript, oUser, -1); } else { DelayCommand(0.1, AssignCommand(oUser, ActionEquipItem(CreateItemOnObject(sDisguise, oUser, 1, TRUE), nSlot, TRUE))); } } void JC_SWAP_HEARTBEAT() { /* Open variables - sItemBase: File name of the item that the user can equip. This item should have no disguise properties on it. The name must be 12 characters or fewer. - sScript: New script to fire equip the disguise. This has to be in a new script file for K1 due to a bug in the script compiler. - nCheckHead: Whether we want to keep the user's original head. - nCheckGender: Whether we want to change appearance based on gender. - nCheckPheno: Whether we want to change appearance based on character class. - nSlot: Which inventory slot the item goes in. 0 = Head 1 = Body 4 = Right Weapon 6 = Left Weapon 7 = Left Arm 8 = Right Arm 9 = Implant 10 = Belt See NWScript for more details. - nB: Boolean used to check if the creature has put the item on. This is currently Boolean 64, but I've left it open for compatibility reasons. */ string sItemBase = "jc_d_test"; string sScript = ""; int nCheckHead = TRUE; int nCheckGender = TRUE; int nCheckPheno = FALSE; int nSlot = 1; int nB = 64; /* Other variables (don't touch) - oUser: The creature that uses the item. But since this is going in the heartbeat script, it should be OBJECT_SELF. - sGender: Suffix to add to the disguise item name, for gender. - sPheno Suffix to add to the disguise item name, for phenotype. - sDisguise: Disguise item name. It's either item base plus the suffixes, or plus "_d" if there are none. For example... Item base = jc_example Disguise (male, small) = jc_example_m_s Disguise (just female) = jc_example_f Disguise (just large) = jc_example_l Disguise (no qualifiers) = jc_example_d Item names and tags should be assigned accordingly in the UTI files. - oEquip: The item currently equipped in nSlot. - sEquip: Tag of oEquip. */ object oUser = OBJECT_SELF; string sGender = ""; if( nCheckGender == TRUE ) sGender = JC_SET_GENDER(oUser); string sPheno = ""; if( nCheckPheno == TRUE ) sPheno = JC_SET_PHENO(oUser); string sDisguise = sItemBase + sGender + sPheno; if( sDisguise == sItemBase ) sDisguise = sItemBase + "_d"; object oEquip = GetItemInSlot(nSlot, oUser); string sEquip = GetStringLeft(GetTag(oEquip), GetStringLength(sItemBase)); //This will clear the player's inventory of any disguise items, replacing them with dummy copies. JC_SWAP_INVENTORY(sItemBase, GetFirstPC()); //This will replace the dummy item with the proper disguise item if equipped. if( !GetLocalBoolean(oUser, nB) && sEquip == sItemBase ) { SetLocalBoolean(oUser, nB, TRUE); JC_SWAP_EQUIP(sDisguise, nSlot, oUser, sScript); } } void main() { int i; for( i = 0; i < 30; i++ ) { DelayCommand(IntToFloat(i) * 0.2, JC_SWAP_HEARTBEAT()); } } It's untested but it compiles properly so I assume there aren't huge problems with it. This the K2 version. A script for K1 would have to be adjusted slightly, but I didn't feel like doing it all yet. So if anyone wants to test it, I'd be very interested in seeing the results.
-
That wouldn't be compatible with any head mods, though. And would be a fair bit more work with setting up all the 2DAs, and you'd also have to directly map each appearance to each new appearance in the script, which would mean using the TSL Patcher for the script too. But sure, that is an option in theory.
-
I haven't taken a look at that mod, but that's basically it, yeah. In an ideal situation, the item you actually equip would have no disguise property, then the heartbeat script would fire and replace it with the disguise one. And then similarly swap out any in the inventory with the dummy version. Disguise effect wouldn't preserve the head, though. All that nonsense is just to preserve the head. You shouldn't need booleans if we're talking about mask items. The heartbeat script would only need to check if the item doesn't have the correct disguise property, which could be handled through the item tag. Mm, like I said I've thought about doing it before too... I've just never had a reason to try it. If I have time I might write up some generic code at least as a starting point.
-
I've given this some thought before. It's totally possible with the heartbeat script, just not... practical. But if you do want to go with that option, there is an alternative to the disguise effect. You could script the heartbeat to remove and replace the item, depending on whoever is wearing it, and then make multiple copies of the item, each with the right disguise property. However, you wouldn't be able to include those items in the upgrade system, since you'd be destroying the upgrade parts every time the item was equipped. That couldn't be removed through ClearAllEffects and as a bonus the disguise would be removed immediately when the item is removed. If you want to retain each character's head though, that's much trickier. There is a function for that, DuplicateHeadAppearance, but it requires two spawned objects in order to compare their heads. You can't just input head numbers. It might be possible to implement, but because it would be so convoluted I never attempted it. It would go something along the lines of... Equip item -> Heartbeat script fires -> get the item user's current appearance, before the disguise item -> apply the disguise item -> spawn a creature, any creature (ideally somewhere the player can't see) -> apply the desired disguise effect to that creature -> DuplicateHeadAppearance with the spawned creature and the item user (assuming it gets the right head) -> delete the spawned creature -> item user now has the desired head and body combination. There are a number of potential issues I can imagine. You'd probably have to set a boolean for whether the item has been equipped or not, to make sure the script is fired when the item is equipped but also when it is removed to fix everything, and also to account for area transitions, party members being sent away and then summoned again, etc. You might also have to store the player's appearance as a numeric so you can call it again later. I'm not sure if simply removing the item would set everything back to normal, so you might have to repeat the spawning and duplicating procedure, or apply a disguise effect using the player's original appearance, or maybe apply any other disguise effect and then clear it... I could go on and on. Like I said, convoluted. But it may be possible. And it's tempting.
-
I've converted each shot with the stacks into an image sequence for anyone who wants to look into this: Jedi Library Stacks
-
Seikan's Armors of the Old Republic Revival
JCarter426 replied to Seikan's topic in Work In Progress
Looks like it's from one of the visual effect models, v_revmask1_dur or v_revmask2_dur (I believe that's just male/female). -
Fascinating discoveries researching NWN tools
JCarter426 replied to xander2077's topic in General Kotor/TSL Modding
Sounds like one of the metamagic feats. A lot of that was left in KOTOR and may be functional - for example, all the existing spell casting functions include a parameter for metamagic feats - although I never took a look at it. There's other stuff that's in a similar state. It seems the Sith uniform was going to be done through a polymorph spell, and so that might be still functional. Also the time stop effect does work, although it makes the game a little crazy. It freezes literally everything in the game. -
Fascinating discoveries researching NWN tools
JCarter426 replied to xander2077's topic in General Kotor/TSL Modding
I doubt adding model accessories would be possible. It looks like the 2DAs were set up to allow for it, but the models weren't. There are no hooks for the additional items, nor do I see any way of assigning them. A lot of stuff that was fully functional in NWN was simply stripped away from KOTOR. Since they actually made distinct models for all the items, I assume they intended to put it in at some point... but maybe they ran out of time, or they couldn't get it to look nice. So even if the belts and such have models, there's no way to tell the game to render it, at least not that I can see. -
User content does not count as "personal information". The terms of service had a whole section covering user content and it affirms that user content was always the intellectual property of the user: It stipulates that the site is free to maintain and distribute copies according to the needs of the site's function (since that's how hosting works) but they claim no ownership of the files and include provisions for removal of files. They have since shut down the site, so all this agreement is effectively terminated. It does not apply to Nexus or any other site. GameFront has nothing to do with where the files are going now. They shut down their site and are no longer hosting the files. But they gave a warning before the shutdown so users could get what they wanted before time ran out. So some people in the modding community used the Internet Archive and other means to create a backup - just copies of the Filefront webpages as they originally appeared, as if the site were still hosted. The Nexus staff then took the files from these backups and began hosting them on their own site, without seeking permission - or even any form of communication at all. So, it's all right because it was their plan to unilaterally ignore everyone's intellectual rights from the beginning. The problem I have is that they're not just preserving the files. The mods were actually already saved and are in no danger of being lost. They may be more difficult to find for the average user, but they are there, in their original state, the state everybody agreed to. This was the most that had to be done to save the content from being lost, and it was the most that could be done while still respecting the rights of everyone involved. Nexus, on the other hand, has chosen to take these files and integrate them into their website structure. These stolen mods appear alongside other mods as if they were uploaded legitimately. They're being allowed to get away with this because they claim to be doing this for the greater good of saving these mods. And the users of their site praise them for this because to them, to the users of Nexus that don't frequent Deadly Stream or JKHub or the other respective communities, Nexus is their savior, because their disregard for intellectual property allows their hosting to be more public and convenient. But I don't know these users on Nexus. And they don't know me. There has never been any interaction between us. I don't upload mods there because I upload them here and on LucasForums, where the KOTOR modding community is active (to a degree). If you take content I created and distribute it on a site I don't use to people don't know, without involving me at all, it feels like you're going behind my back. That's what bothers me. The interaction is cut. I'm never going to hear what they think of my mods and the only mods of mine they ever get to see are the ones that happen to have been stolen - which in this case, are from years ago, some bugs and lacking the updates I've already done. And that's not fair to either side. It's that interaction that keeps the modding community alive.
-
They don't have to make the mods public on their website in order to preserve the files. They don't have to release them all at once under a dummy account rather than putting the absolute least effort possible in attempting to contact and properly credit any of the authors at all.
-
Yeah, that's a little crazy. We could go back and forth over the issue ignoring authors' rights to preserve their work, but this part I cannot fathom. How do you justify uploading content created by users of your own site under a different name without their permission... without even contacting them? That's inexcusable. This is not an issue of tracking down people based on the email they used a decade ago. I already had an account on Nexus - I don't upload mods with it because I don't particularly like the site, but it's the same username, email, etc that I used for Filefront. Sithspecter actually uploads mods on Nexus! You don't need to hire a private investigator to figure out who we are.
-
Well, as soon as I heard about this I contacted their staff to have my mods removed and they did so today. I maintain backups of all my releases and I reupload the old ones I think are not of embarrassingly terrible quality, or which are specifically requested, so they were never lost. I don't care to have my mods on Nexus, and in a couple cases they were uploading older versions that contained bugs. So there are pretty good reasons for these files to not be there, if you needed a reason other than the fact that I never consented to it.
-
It's PLC_cputerCon, but I'll leave the texturing to someone more competent.
-
View File JC's Merchant Inventory Fix for K2 This is a slight fix to address a problem that arises with certain mods. Certain weapon and armor textures are present in some other models, so if you install a mod that alters the texture mapping of these items, it creates a bit of a mess. This mod replaces the textures in these instances, so they will always use the original game textures. If you don't have any other mods installed, this won't do anything. But it won't hurt to have it installed either. If you spot any more incidents of this problem, please contact me and I'll add it to a future release. Submitter JCarter426 Submitted 05/19/2016 Category Mods TSLRCM Compatible
-
Version 1.1
881 downloads
This is a slight fix to address a problem that arises with certain mods. Certain weapon and armor textures are present in some other models, so if you install a mod that alters the texture mapping of these items, it creates a bit of a mess. This mod replaces the textures in these instances, so they will always use the original game textures. If you don't have any other mods installed, this won't do anything. But it won't hurt to have it installed either. If you spot any more incidents of this problem, please contact me and I'll add it to a future release. -
Ah, I wasn't sure if you had or not. I was working on this since I played with Toasty Fresh's models and I was planning to check out yours on my next go.
-
View File JC's Merchant Inventory Fix for K1 This is a slight fix to address a problem that arises with certain mods. Certain weapon and armor textures are present in some other models, so if you install a mod that alters the texture mapping of these items, it creates a bit of a mess. This mod replaces the textures in these instances, so they will always use the original game textures. If you don't have any other mods installed, this won't do anything. But it won't hurt to have it installed either. If you spot any more incidents of this problem, please contact me and I'll add it to a future release. Submitter JCarter426 Submitted 05/19/2016 Category Mods K1R Compatible
-
Version 1.1
3,410 downloads
This is a slight fix to address a problem that arises with certain mods. Certain weapon and armor textures are present in some other models, so if you install a mod that alters the texture mapping of these items, it creates a bit of a mess. This mod replaces the textures in these instances, so they will always use the original game textures. If you don't have any other mods installed, this won't do anything. But it won't hurt to have it installed either. If you spot any more incidents of this problem, please contact me and I'll add it to a future release. -
[KotOR] Decompiling .ncs files and camera issues
JCarter426 replied to Salk's topic in General Kotor/TSL Modding
The camera problem you're having is just one of the game's oddities, and there's no easy way to fix it. When the camera is set to angle 0, the game randomly selects another angle - usually 1, 2, or 3. 1 is a close-up of the speaker, 2 is over the listener's shoulder, and 3 is a wide shot. When angles 2 and 3 can't be displayed correctly - if there are other characters between the speaker and listener, or if they're too close to a wall, or whatever - then the game defaults to another angle instead. In this case, the game is defaulting to a close-up of the player. This problem can happen anywhere at any time, and it's not a problem that's going to arise every time, because it depends on the positioning of the characters and the random selection of the camera angles. So the only thing you can do is what you've been doing - fix each problem as they arise. Changing the angles to 1 shouldn't cause any problems, although it removes the variety of the angles, or at least, the variety that's there when it actually does work correctly.
