Finaltwist submitted a new resource:

UO Odyssey fork - evolving the world - uo odyssey runuo

A few players of UO Odyssey by Djeryv have started modifying the world, and in an attempt not to take over that excellent resource with parallel discussion, we are starting a new fork of the world. Anyone who wants to post improvements/changes to UO odyssey can post here.

My current fork of the world can be found on this dropbox folder :)

changelog to come, there are many changes!


The original Odyssey is needed to take advantage of the changes, which can be found here https://www.servuo.com/archive/ultima-odyssey.1117/

In order to start a new game of the fork:

1. download the original odyssey server and client
2. delete the scripts folder
3. move everything in the fork archive into the UO folder, and overwrite everything
4. copy all the files in the /FILES/ folder and copy that into the client folder, overwrite.
5. you should be good!


Read more about this resource...
Post automatically merged:

okay, @Gadget2013 posted this in the other thread - we are trying to figure out how to publish and update the world without breaking people's save folder

C#:
Ok, one of the things you can do is:
[spawngen save - to save all the premiumspawners to Spawns.map
[spawngen remove - to delete all the premiumspawners in the entire world
[spawngen Spawns.map - to load all the premiumspawners from Spawns.map again

I will try this Gadget, did it work for you?
 
Last edited:
Yes, it did work for me :) It respawned the entire world's PremiumSpawners without affecting anything else, it seems.

And nice job starting this new resource, I think this is the proper way to go so that we don't overwhelm the original thread with our largely experimental modifications :) Hopefully our posts from the original thread can be moved here by the mod, if possible - that'll make our developments a little bit more structured and also separate, thus less confusing :)
 
yeah.. i guess i need to write a changelog to tell people how it differs from the original... ugh. so much to do so little time... and i'm supposed to be working too :D

thanks for the instructions on the premiumspawners, ill get that done right away. another thing that needs to be changed is the dialogue options for the cities... change trinsic to montor for example... i lost your (or harryberry?) edits to citizens, were you incorporating citizens and townsperson? you'd need to edit the meeting spot item
 
Hehe, no pressure there, feel free to do it when you have some time :) It is, after all, meant to be a fun hobby after all, not a pressing kind of work :)
 
man i spent all day yesterday, a solid 10 hours, debugging and working on scripts. this is FUN :)
i'll be working on the baseconvo system, maybe editting a few cities so they are relevant to odyssey.
Post automatically merged:

did the spawn save /delete/spawns.map and it worked! I'm updating the main uo file to reflect the changes...

noticed that the guards talk now too? i'm curious, how do you move your chracter around due to having to replace the saves folder?
 
That sounds like a good idea!:) I'll continue my experiments and testing tomorrow, Will see if I can figure out some more spawning tweaks for town NPCs
 
I'm thinking of taking out the buy/sell vendor context menu. would force people to talk to the vendors "Emily buy" or "vendor buy". seems more in line with that i remember UO to be... context menus make it so you don't have to talk to anyone...
 
I don't yet migrate the character from build to build, I'm using the admin character to run tests and check out the areas and stuff, as well as experiment with different scripts and settings :) sadly, I don't think moving a player mobile from one save to another would be an easy task to do, if possible at all...
 
Djeryv sees it. He's cool with it. It's unintended, but still awesome. Here are your friends Djeryv. Lets make it worth all the hours you poured in.

I actually thought Wizardtim was djeryv for a bit! That's why i thought forking to another thread was a good idea. I don't want to step on any toes and i don't think anyone else does either. Can't please everyone.

Well like ive said many times, i admire and am thankful for djeryv's work. we have added some truly amazing scripts to the world thus far - and even if it doesn't fit in everyone's worldview, it really adds to the flavor of the world. the animal broker is my best friend now, and i love the new recall penalty. makes complete thematic sense and isn't too bad (when it happens, i lose 0.8 of a skill or two no more).

I always wanted my character to have unlimited skill cap, but i also want to add a system whereby you "forgot" skills that you didn't use often. so if you had GM smith, and didnt forge anything in a while, your skill would lower from where you left off. The recall/gate/death penalty does that now.
 
WizardTim is just an 80's CRPG gamer who has been playing this since Dawn of Ultima. I made a post letting the mods know to close the thread.

You guys could simply call it something else like "Ultima Adventures" or "Ultima Worlds". You should come up with your own name/label for it. Odyssey Forked sounds lame. Your name doesn't need the words "Ultima", "Odyssey", or "Djeryv" in it. Although I do encourage the word "Ultima" because it is packed with Ultima lore and play elements.

If you feel the need to give me credit in some way, just put a bulletin board in the tavern with my contribution or something. If someone gives you shit about claiming Djeryv credit...just point them to this thread and tell them to bite you.

Giving it a label of your own lets new players better know what game they want to play. Where some want to play Ultima Odyssey, others may like someone else's Ultima Adventures or Ultima Nights because it also has x, y, and z and removed 1, 2, and 3.

Lastly, for your own sanity, try to figure out how to do updates without removing the SAVES folder. Your players will be way less pissed off about it.
 
We have enjoyed this work since those days too. If it sucked, we would not be having this exchange today. What you created is good, we're just trying to perfect it further.

Good to hear from you! I mean it!
 
WizardTim is just an 80's CRPG gamer who has been playing this since Dawn of Ultima. I made a post letting the mods know to close the thread.

You guys could simply call it something else like "Ultima Adventures" or "Ultima Worlds". You should come up with your own name/label for it. Odyssey Forked sounds lame. Your name doesn't need the words "Ultima", "Odyssey", or "Djeryv" in it. Although I do encourage the word "Ultima" because it is packed with Ultima lore and play elements.

If you feel the need to give me credit in some way, just put a bulletin board in the tavern with my contribution or something. If someone gives you shit about claiming Djeryv credit...just point them to this thread and tell them to bite you.

Giving it a label of your own lets new players better know what game they want to play. Where some want to play Ultima Odyssey, others may like someone else's Ultima Adventures or Ultima Nights because it also has x, y, and z and removed 1, 2, and 3.

Lastly, for your own sanity, try to figure out how to do updates without removing the SAVES folder. Your players will be way less pissed off about it.

That was certainly the intention - i mean giving you credit for the work you put in. I appreciate you being okay with us making edits to the server.

As far as being "lame", don't really care.

As far as pissing off players - well it would be nice to figure it out for anyone who wants to use this version but then again i'm doing this for myself foremost. I'm teaching myself c# gradually in the process which is really the point.

Not sure what thread you want to close, this one or odyssey?
*edit - will certainly put a bulletin board - you deserve credit for what you have done.
Post automatically merged:

im just working on trying to get the vendors to "listen" to players again. no idea why everything switched to context menus - now that the vendors talk back it makes sense to call them by name and say "John buy" instead of clicking on a context menu. why was it taken out?
 
Not lame at all Final. Keep at it. Closing the thread or muting you is simply vanity. I hope this community is not that far gone.
Post automatically merged:

And all that can contribute, please do so. It's not my fun, it's our fun. Don't be dicks you all.
 
Last edited:
Hmm, well i'll rename the resource to anything if that's the issue. had enough drama to be honest, just want to get along!
 
Yeah, I think the stone of humility got lost somewhere along the way.
And Djeryv, this effort is not opposed to your work. It legitimizes it. Do what's right.
 
Last edited:
@Finaltwist: I think making the vendors respond to "vendor buy" / "vendor sell" or "Name buy/sell" should be straightforward enough, you'd just need to hook the relevant keywords in the speech routine and make them call the relevant vendor methods that open the trade window. Not sure if completely disabling the context menu is a good idea, it might confuse some of the players, personally I'd probably see it more as an option (you can click if you want, or you can talk if you want), but of course, it's up to you which approach to take :)

And today I came up with a small patch to the Henchman functions - you know how henchmen will sometimes randomly yell and say stuff as they fight? To randomize that a bit, I hooked up an extra case to the relevant functions so that a henchman has a small chance of uttering one of the 42 emotes at random. To accomplish that, I edited HenchmanFunctions.cs and added this line at positions 47, 55, and 63:

C#:
case 15: new ESound( from, Utility.Random( 1, 42 ) ); break;

If you want a higher chance of that happening, you can add it to a few extra cases, e.g.:
C#:
case 15:
case 16:
case 17:
    new ESound( from, Utility.Random( 1, 42 ) );
    break;

It's a minor thing, but personally I found it somewhat satisfying :D
 
Not sure what thread you want to close, this one or odyssey?
Sorry...I meant the original Odyssey post. It will encourage people to start their own mods under a different umbrella with their unique characteristics. I didn't plan on sticking around again...but this corona crap can really bring out the boredom.
 
I worked a little bit more on my single player Player Vendor mod, this version is now better at handling the item names both when announcing the sale and when advertising with no player-made description given, it'll now use the actual fully qualified item name, like Dull Copper Katana of Such-and-Such, etc. :) Other than that, this version is largely the same. A tiny bug was fixed, but that's about it.
 

Attachments

  • PlayerVendor.cs
    80.5 KB · Views: 16
Sorry...I meant the original Odyssey post. It will encourage people to start their own mods under a different umbrella with their unique characteristics. I didn't plan on sticking around again...but this corona crap can really bring out the boredom.

... any hint on how you made updates doable without overwriting the saves folder????? :D
Post automatically merged:

I worked a little bit more on my single player Player Vendor mod, this version is now better at handling the item names both when announcing the sale and when advertising with no player-made description given, it'll now use the actual fully qualified item name, like Dull Copper Katana of Such-and-Such, etc. :) Other than that, this version is largely the same. A tiny bug was fixed, but that's about it.

merging into my server!

I see you got rid of those solaris commands! :D

Post automatically merged:

@Finaltwist: I think making the vendors respond to "vendor buy" / "vendor sell" or "Name buy/sell" should be straightforward enough, you'd just need to hook the relevant keywords in the speech routine and make them call the relevant vendor methods that open the trade window. Not sure if completely disabling the context menu is a good idea, it might confuse some of the players, personally I'd probably see it more as an option (you can click if you want, or you can talk if you want), but of course, it's up to you which approach to take :)

And today I came up with a small patch to the Henchman functions - you know how henchmen will sometimes randomly yell and say stuff as they fight? To randomize that a bit, I hooked up an extra case to the relevant functions so that a henchman has a small chance of uttering one of the 42 emotes at random. To accomplish that, I edited HenchmanFunctions.cs and added this line at positions 47, 55, and 63:

C#:
case 15: new ESound( from, Utility.Random( 1, 42 ) ); break;

If you want a higher chance of that happening, you can add it to a few extra cases, e.g.:
C#:
case 15:
case 16:
case 17:
    new ESound( from, Utility.Random( 1, 42 ) );
    break;

It's a minor thing, but personally I found it somewhat satisfying :D

Good idea!! your henchmanfunction probably looks different to mine... line 47 is just a } under the foreceslow... can you share your henchmanfunctions? I'll merge

Making vendors listen again is not that easy actually - i got a proper function to work (they would show their sell/buy gumps on "vendor sell", but now that the NPCs are baseconvo (what i added yesterday), everytime you engage the NPC, baseconvo steps in and only replies with baseconvo replies (the functions that call in the gumps don't show). I"ll tweak this to the best of my knowledge today. You're right... i don't think everyone will want the context gump gone like me.

one of my next projects is to add a bunch of contraversial changes to "myserversettings". that way people can turns stuff off and on as they like. gumps will be one of those, so will the teleport curse, and item decay.
 
Last edited:
Sure thing, here's my HenchmanFunctions.cs :)
And yeah, no need for the Solaris CliLoc function call in PlayerVendor now :D

And here's a somewhat further updated PlayerVendor, I cleaned it up, removed code duplication related to advertisement, and actually made advertising and announcing sales separate (no need to call a variant of advertisement on an unsuccessful sale, stuff is advertised often enough anyway :) ) This also avoids a double ad call at the same time in certain corner cases.
 

Attachments

  • HenchmanFunctions.cs
    49.2 KB · Views: 11
  • PlayerVendor.cs
    79.7 KB · Views: 9
Last edited:
First of all, Odyssey comes with a SAVES folder that must be used because the SKY CASTLES and DUNGEON HOMES were made possible by the Knives Townhouse system. You have to define these homes in-game and thus cannot be added with a simple script. Once I had that base world, I could then do everything else through scripts or file replacements.

-Overwriting client files is safe.
-Wiping NPCs is safe as long as they are not tamed/owned.
-Overwriting server files is safe...except...the INFO folder as this is supposed to be unique to their shard.
-Wiping decorations is safe, obviously.

Here are some annoynances I have caused over the years:
- I would alter monsters by adding new serialized attributes which would wipe someone's pet dragon (for example). This eventually led me to make new monsters and just remove the old ones from spawning. So I have new wyrms (for example) and to make sure I didn't annoy anyone who tamed a wyrm...I left the old ones in an obsolete folder so they didn't get wiped.
- I would alter items by perhaps changing its class or like the monsters above with new serialized values, wiping the current ones from existence.
- Changing the map to cause player housing or marked runes to be wrecked.
----So as soon as you change something like a class or add/remove serialization values the server is going to puke at boot time and ask you to delete them all.

I notice you swinging around the mantra of "I am just doing this for me". If that were true, it wouldn't be publicly visible/available. I tried that same mantra and I still had people pissing in my ear as though I was some kind of professional developer that owed them something as though they funded a kickstarter for me. So if someone decides to play your game and is running around with their tame royal dragon...only to do an update and lose their royal dragon or their sword of kickassery...get ready for the bitching no matter how many disclaimers you throw on it.

I would also recommend you take one of my clients and make it an Ultima Adventures client. Don't confuse the end user by having them download multiple files from different locations and merging them together. End users need simple instructions they can understand...and even then...they fail at the simple instructions. Once you have your own client for Ultima Adventures...then you can make all the changes to that and then the new player (or updater) can get what they need in one spot.

#################################

The world runs itself thanks to the task manager system. People would sometimes make a decision to have items/npcs/etc run a timer for themselves to perform certain actions/tasks. Although this is fine in the beginning, you could end up with 10,000 npcs all running some type of timer that the server has to tick on. I actually killed an old shard I was running due to this overload so now there are some task manager stones in Lord British's castle. They are hidden so players don't see them but there are 5 of them and they each have a time they trigger:

EVERY HOUR:
randomize magic mirrors.
move merchants/guards back to their original spots in case they chased a player or something so they are not in their original place.
randomize the exploding mushroom colors/names.
remove derelict boats and dead body containers so they can respawn in new locations.
randomize the altars/shrines.

EVERY 150 MINUTES:
replant the gardens.

EVERY 200 MINUTES:
reset any coffers that may have been stolen from.
reset any hollow stumps or hay crates that may have been ransacked.
reconfigure some land-based premium spawners, which may be hard to explain:
------------------
I have some land spawns that have a small radius in which they fill. Let's say I have a cyclops that would always spawn in this small radius...but I didn't want this cyclops to spawn all of the time. Every 200 minutes, the spawner is then reconfigures so that a cyclops may spawn or it may not...and then a new decision will be made in another 200 minutes if the cyclops will spawn or not. It just added more world spawn diversity so one time you may pass through an area safely or you may pass through it later on and a huge monster is there.
------------------

EVERY 250 MINUTES:
repopulate cities with the chatting adventurers.

ONCE PER DAY:
randomize stealable pedestals.
randomize the location for runic pedestal boxes in dungeons.
randomize the location for special items like book of truth, black rock, candle of love, chest of virtue, etc.
cleanup wide spread spawns in the land and respawn them (which are things like wandering healers or sea creatures).
move exodus to a new dungeon.
move Jormungandr to a new ocean.
move the lense gargoyles to new dungeons.
clear the sea of NPC ships and respawn them.
randomize public areas of npcs like the tavern.

Some of these tasks actually run at server boot time in case you don't run a 24x7 server.

But pick apart the server load here if we take the mushrooms for example. Some would set each mushroom to have its own timer to change itself every X minutes. So you could have 5,000 mushrooms running a ticker on your server. Here, I have a single task manager doing a single task of ticking minutes. When the time is up, the task manager will just change every mushroom itself so that is 4,999 less items ticking time on my server.

#################################

One script that runs in this mix is the below...

\UO\Scripts\Server\Build Things\CreateQuestItems.cs

...you should look it over to see how I add a complicated item to the game where a decoration file or spawner won't help me because they are just too complicated. You could probably add a champion spawn in a similar fashion and have it part of a buildworld function.

#################################

The BUILDWORLD command does two important things. It destroys everything it created...and it rebuilds it from scratch. One may simply focus on a script that adds things but if you don't clean up the mess first you could run into unforseen issues like duplicate items, monsters, or items and monsters you really wanted gone with an update.

So I made sure everything could be done with the BUILDWORLD command:

---------------------------------------------------------------------------------------
This cleans up the NPC ships on the seas so new ones can spawn.
---------------------------------------------------------------------------------------
Server.Multis.BaseBoat.ClearShip();


---------------------------------------------------------------------------------------
This DungeonHomesDecorated value isn't really needed, but it makes sure the dungeon homes and such have doors placed and if not...place them later on in this script. They are part of the SAVES folder already but I kept this here just in case I needed it.
---------------------------------------------------------------------------------------
int DungeonHomesDecorated = 0;


---------------------------------------------------------------------------------------
This part removes an premium spawners, potion cauldrons, or magic pools becaues they are going to be rebuilt. It also checks to see if the dungeon homes have been decorated or not so if it finds items with a -3.0 weight that probably means they are decorated.
---------------------------------------------------------------------------------------
ArrayList targets = new ArrayList();
foreach ( Item item in World.Items.Values )
if ( item is PremiumSpawner || item is PotionCauldron || item is MagicPool )
{
targets.Add( item );
}
else if ( item.Weight == -3.0 ) // DECORATE DUNGEON HOMES IF THEY ARE NOT ALREADY
{
DungeonHomesDecorated++;
}
for ( int i = 0; i < targets.Count; ++i )
{
Item item = ( Item )targets[ i ];
item.Delete();
}


---------------------------------------------------------------------------------------
This cleans up roaming monsters in preparation for a fresh spawn
---------------------------------------------------------------------------------------
ArrayList beings = new ArrayList();
foreach ( Mobile being in World.Mobiles.Values )
if ( being is BaseCreature )
{
BaseCreature bc = (BaseCreature)being;

if ( bc.Home.X > 0 && !bc.IsStabled && !bc.Controlled && bc.ControlMaster == null )
beings.Add( being );

if ( bc is Citizens )
beings.Add( being );
}
for ( int i = 0; i < beings.Count; ++i )
{
Mobile being = ( Mobile )beings[ i ];
being.Delete();
}

---------------------------------------------------------------------------------------
This decorates the world based on "\UO\Scripts\Server\Build Things\Decorate.cs". To create them, I decorated the areas in-game and did a STAEX command to dump it to a text file that I could then copy/paste into one of those decoration files. I then wipe the area I just decorated so those items don't remain behind. The decoration command places decorations in the world at -2.0 weight because I have a script that will delete any items at -2.0 weight before decorating again. It was the easiest way I could think of to remove old decorations so I can add new ones. This is why I recompiled the EXE so items would not show their weight value if <=0.
---------------------------------------------------------------------------------------
Server.Commands.Decorate.Decorate_OnCommand( e );
if ( DungeonHomesDecorated == 0 ){ Server.Commands.Monopoly.Monopoly_OnCommand( e ); }


---------------------------------------------------------------------------------------
These spawn the world with premiumspawners. To make these, I would place regular RunUO spawners in the world and then do a RUNUOSPAWNEREXPORTER command to dump them into a file that is premium spawner friendly. I would then edit those to my design (time, range, monsters, etc) and paste them into one of the files below.
---------------------------------------------------------------------------------------
Server.SpawnGenerator.Parse( e.Mobile, "dangers.map" );
Server.SpawnGenerator.Parse( e.Mobile, "land.map" );
Server.SpawnGenerator.Parse( e.Mobile, "animals.map" );
Server.SpawnGenerator.Parse( e.Mobile, "world.map" );
Server.SpawnGenerator.Parse( e.Mobile, "pirates.map" );
Server.SpawnGenerator.Parse( e.Mobile, "spread.map" );
Server.SpawnGenerator.Parse( e.Mobile, "towns.map" );


---------------------------------------------------------------------------------------
This just respaws my region spawners...which are just the hidden traps and loot in dungeons.
---------------------------------------------------------------------------------------
Server.Regions.SpawnEntry.RespawnAllRegions_OnCommand( e );


---------------------------------------------------------------------------------------
This populates the cities based on the MEETING SPOT tiles I placed because I wanted these (orange named) adventurers to be standing in a specific spot to appear as adventures stopping in town to rest and thus chatting with each other. The system spawns at least 2 npcs per spot and not all spots are used during a spawn cycle to provide randomness. A maximum of 4 could potentially spawn and then there is a random chance they will have a mount. These npcs are crucial to the game because you have to speak with everyone you can to find rumors of where the musuem artifacts are or quest journal/diary items. They also provide random services potentially like fixing armor or selling magic items they found. If you look at the TASK MANAGER scripts, there is a section where every so often these npcs get wiped and new ones added to randomize the cities. If you are nearby when it happens, they simply poof away.
---------------------------------------------------------------------------------------
Server.Mobiles.Citizens.PopulateCities();


---------------------------------------------------------------------------------------
Spawns UO's canned stealable artifacts.
---------------------------------------------------------------------------------------
Server.Items.StealableArtifactsSpawner.RemoveStealArties_OnCommand( e );
Server.Items.StealableArtifactsSpawner.GenStealArties_OnCommand( e );


---------------------------------------------------------------------------------------
Creates random coffers in shops.
---------------------------------------------------------------------------------------
Server.Items.Coffer.ConfigureAllThiefQuestItems();


---------------------------------------------------------------------------------------
Sets the basement doors based on your preferences if you use them or not.
---------------------------------------------------------------------------------------
Server.Items.BasementDoor.ConfigureBasementDoors();


---------------------------------------------------------------------------------------
This simply places a custom data pad in the time lord's chamber so those making a space alien can read the text in it.
---------------------------------------------------------------------------------------
DataPad pad = new DataPad();

Point3D loc = new Point3D( 3566, 3413, 5 );
pad.DataID = 59;
pad.Weight = -2.0;
pad.Movable = false;
pad.ItemID = 0x27FC;
pad.DataTitle = "Far From Home";
pad.Name = pad.DataTitle;
pad.DataAuthor = "Chief Medical Officer";
pad.DataSubject = "Medical Shuttle Lost";
pad.InvalidateProperties();
pad.MoveToWorld( loc, Map.Trammel );


---------------------------------------------------------------------------------------
Even though magic pools and potion cauldrons are spawned via premium spawner, they would remain during a rebuild and thus have 2 in the same spot. This function just ensures that doesn't happen.
---------------------------------------------------------------------------------------
ArrayList specials = new ArrayList();
foreach ( Item item in World.Items.Values )
if ( item is PotionCauldron || item is MagicPool )
{
specials.Add( item );
}
for ( int i = 0; i < specials.Count; ++i )
{
Item item = ( Item )specials[ i ];
item.Delete();
}


---------------------------------------------------------------------------------------
Just about every dungeon has a magic mirror. Almost all of them are hidden and 2 per world are visible at any given time. If you ever run into a magic mirror, and decide to use it, it may teleport you to another dungeon or to some random spot in the land. This is totally random and there is a scheduled task to mix them up every so often.
---------------------------------------------------------------------------------------
Server.Items.MagicMirror.SetMirrors();
 
Amazing djeryv... that's like the sourcecode to odyssey! that's really going to help us move this along our different ways... need to re-read this multiple times!

FYI:

I added settings in myserversettings for skillcap/statcap for new players, item decay, buy/sell vendor context menus.. i also fixed the "vendor buy" ... you can now talk to vendors completely, and when you say "buy" they show their buy gump. sale for sell too!

Also merged gadget's edits above. will update the dropbox in the next hour or so.
Post automatically merged:

Sure thing, here's my HenchmanFunctions.cs :)
And yeah, no need for the Solaris CliLoc function call in PlayerVendor now :D

And here's a somewhat further updated PlayerVendor, I cleaned it up, removed code duplication related to advertisement, and actually made advertising and announcing sales separate (no need to call a variant of advertisement on an unsuccessful sale, stuff is advertised often enough anyway :) ) This also avoids a double ad call at the same time in certain corner cases.

1588343080122.png

uhm... i won't just copy your playervendor next time... reverting
Post automatically merged:

Dropbox folder updated to uo MAy 1st version. this is a stable version which includes a (fully working) baseconvo system for vendors, and additional bugfixes and myserversettings. I would recommend updating to this version. ad april 29/30 had bugs.
Post automatically merged:

added a (.mul) rest area in ambrosia for those participating in the champ spawns. This area will be populated with powescroll vendors and customblues, as well as an inn for food and drink


Capture1.JPG

The best part... the large building is an arena. I've actually hired a programmer to make me a PvM tournament script, where players will be able to participate in randomized spawns to see if they can survive

Capture.JPG
 
Last edited:
Sorry...I meant the original Odyssey post. It will encourage people to start their own mods under a different umbrella with their unique characteristics. I didn't plan on sticking around again...but this corona crap can really bring out the boredom.
And too much drink. Apologies friends.
 
Not sure what you meant on the drink comment!

Ive updated my server to Djeryv's latest release, few minor tweaks to scripts, new citizen type is possible now. As far as i know the only map change djeryv did was the time awaits decorations, so i haven't merged mul files.
 
Only the Time Awaits thing and City of Embers had a tweak to the exit/entrance to hopefully make it more visible to people.

thanks djeryv, i'm currently working on a gravestone system that drops whenever a player dies (fully movable). that way the world will always have a marker commemorating that player's death at that place. i think it'll be a fun addition - and since there's no item decay on my fork they'll always be there.

it's not an easy process for me, since i'm new to programming, but i'm slowly working at it!
 
I'm of the opinion if you do this gravestone thing, it should be linked to the players living status. IE: If the player is ressed by npc or healer, the stone should vanish.
 
I'm of the opinion if you do this gravestone thing, it should be linked to the players living status. IE: If the player is ressed by npc or healer, the stone should vanish.
thats a good idea for a shard with multiple players... but in a solo shard there wouldn't be much point then?
My goal is to have reminders strewn all over of where my character died and how. adds a little bit of history and flavor to the world. the tombstones would have ot be movable and passable of course.

"hey, i remember when that ettin killed me here 3 months ago!" sort of thing.
 
That's definitely interesting, I'd just be concerned about clutter or blocked pathways if you die in a place repeatedly.
yeah that's why they would have to be passable. because of the stacked items, i guess you could die 7 times in the same tile and there wouldn't be a problem.. then again if the tombstones are movable you can just move them if that ever happens :D

anyways i'm far from having this set up... just figuring out how to program the script

there's a script i have i want to add - an interest system where interest is paid to money that is put in an interest bag in the bank. you can't use the money in the interest bag ... but i'm having issues with the script....
 
First time playing Odyssey and Adventures both.

Quick question: I recently found my way to Sarth Abbey and I have tons of invisible walls/content. All I can see are doors and signs occasionally here. I'm using the ClassicUO client. I think the walls are still there because my character cannot pass through them.
 
I believe the problem with the invisible buildings has to do with the fact that you haven't updated the client with Finaltwist's changed .mul files. Which actually brings up the importance of having a separate patched Adventures client download that would already have the correct .mul files in it, as Djeryv said - might be a good idea to consider :)
Post automatically merged:

@Finaltwist: And ah, looks like I've given you the wrong PlayerVendor file - personally I'm using the newer syntax with the verbatim strings (with the $ sign), but I'm also maintaining the version which has those changed into standard strings. I just always forget that you can't use my main one directly :) I'll send you an updated version later today, want to work a bit more on the system :)
Post automatically merged:

@Finaltwist: Alrighty, here's hoping that this version of PlayerVendor will work for alright for you, this should be the $-free version ;)
This version has a few more changes compared to the previous build. First of all, the key master toggle parameters are now configured through MyServerSettings, so you'll need to add the following code somewhere in your MyServerSettings to make this work:

C#:
        // ******************************************************************************************************************************************
        // This section defines whether the simulated Player Vendor system is active or not, as well as defines
        // its properties.

        public static bool EnableSimulatedPVSales() // If enabled, Player Vendors will try to randomly "sell" items to virtual bot adventurers every 10 minutes (by default)
        {
            return true;
        }

        public static bool EnableRandomPVAdvertisements() // If enabled, Player Vendors will randomly shout advertisement lines based on sold item names and descriptions
        {
            return true;
        }

        public static bool PVChargeForServicePerUODay() // If enabled, Player Vendors will charge a certain amount of money (dependent on the total price of the items for sale) for their services every UO day
        {
            return true;
        }
        // ******************************************************************************************************************************************

As you can guess from the code, this is also the first version that enables the player vendors to charge money every UO day instead of every real day (which can be enabled or disabled with the PVChargeForServicePerUODay setting in MyServerSettings). When enabled, each player vendor will charge the player 5 gp + a small percentage of the price of items per UO day (I believe the UO day is 2 hours of real time). Usually this is a pretty token payment, to be honest, and at least it makes the player feel the necessity to use the vendor for something and to try to be realistic in pricing items, since items that remain unsold for a long time will only increase the amount of money charged per day, thus making the player lose some small amount of money instead of gaining it. The amount of money charged can be tweaked in ChargePerUODay / ChargePerDay, I currently left it as default as it seemed quite reasonable to me so far.

This version also updates the way the EnableSimulatedPVSales master toggle works - if disabled, it should completely revert the PlayerVendor behavior to the stock Ultima Odyssey one, with no virtual sales and with the charge of 1 gp per real day.
Post automatically merged:

Note that this version of PlayerVendor also refactors the toggle code inside PlayerVendor.cs a little bit, moving the three settings that are now defined through MyServerSettings higher up the class chain into PlayerVendor itself (from the relevant timers).
Post automatically merged:

And this version of PlayerVendor.cs is further cleaned up, with all the settings for the simulated virtual sales moved up into PlayerVendor so that they're all in one place. You need the MyServerSettings update from the post above for this version as well.
 

Attachments

  • PlayerVendor.cs
    80 KB · Views: 3
  • PlayerVendor.cs
    80.1 KB · Views: 3
Last edited:
First time playing Odyssey and Adventures both.

Quick question: I recently found my way to Sarth Abbey and I have tons of invisible walls/content. All I can see are doors and signs occasionally here. I'm using the ClassicUO client. I think the walls are still there because my character cannot pass through them.

you forgot to copy the FILES folder to your UO classic folder and overwrite the muls. you will need to swap FILEs to/from oddyssey and adventures if you want to play both. if the muls aren't overwritten you won't see any of the map changes (you haven't seen the roads, etc right?
Post automatically merged:

I believe the problem with the invisible buildings has to do with the fact that you haven't updated the client with Finaltwist's changed .mul files. Which actually brings up the importance of having a separate patched Adventures client download that would already have the correct .mul files in it, as Djeryv said - might be a good idea to consider :)
Post automatically merged:

@Finaltwist: And ah, looks like I've given you the wrong PlayerVendor file - personally I'm using the newer syntax with the verbatim strings (with the $ sign), but I'm also maintaining the version which has those changed into standard strings. I just always forget that you can't use my main one directly :) I'll send you an updated version later today, want to work a bit more on the system :)
Post automatically merged:

@Finaltwist: Alrighty, here's hoping that this version of PlayerVendor will work for alright for you, this should be the $-free version ;)
This version has a few more changes compared to the previous build. First of all, the key master toggle parameters are now configured through MyServerSettings, so you'll need to add the following code somewhere in your MyServerSettings to make this work:

C#:
        // ******************************************************************************************************************************************
        // This section defines whether the simulated Player Vendor system is active or not, as well as defines
        // its properties.

        public static bool EnableSimulatedPVSales() // If enabled, Player Vendors will try to randomly "sell" items to virtual bot adventurers every 10 minutes (by default)
        {
            return true;
        }

        public static bool EnableRandomPVAdvertisements() // If enabled, Player Vendors will randomly shout advertisement lines based on sold item names and descriptions
        {
            return true;
        }

        public static bool PVChargeForServicePerUODay() // If enabled, Player Vendors will charge a certain amount of money (dependent on the total price of the items for sale) for their services every UO day
        {
            return true;
        }
        // ******************************************************************************************************************************************

As you can guess from the code, this is also the first version that enables the player vendors to charge money every UO day instead of every real day (which can be enabled or disabled with the PVChargeForServicePerUODay setting in MyServerSettings). When enabled, each player vendor will charge the player 5 gp + a small percentage of the price of items per UO day (I believe the UO day is 2 hours of real time). Usually this is a pretty token payment, to be honest, and at least it makes the player feel the necessity to use the vendor for something and to try to be realistic in pricing items, since items that remain unsold for a long time will only increase the amount of money charged per day, thus making the player lose some small amount of money instead of gaining it. The amount of money charged can be tweaked in ChargePerUODay / ChargePerDay, I currently left it as default as it seemed quite reasonable to me so far.

This version also updates the way the EnableSimulatedPVSales master toggle works - if disabled, it should completely revert the PlayerVendor behavior to the stock Ultima Odyssey one, with no virtual sales and with the charge of 1 gp per real day.
Post automatically merged:

Note that this version of PlayerVendor also refactors the toggle code inside PlayerVendor.cs a little bit, moving the three settings that are now defined through MyServerSettings higher up the class chain into PlayerVendor itself (from the relevant timers).
Post automatically merged:

And this version of PlayerVendor.cs is further cleaned up, with all the settings for the simulated virtual sales moved up into PlayerVendor so that they're all in one place. You need the MyServerSettings update from the post above for this version as well.
okay i'll integrate the changes... as far as timers go, you could also use djeryv's global timers... i had a look at them yesterday.. he has a 30 minute timer which would fit nicely here. that way you're not running a new separate timer each vendor. do a search for "taskmanager"
Post automatically merged:

i wasn't sure which playervendor.cs was latest, so i merged all changes (you moved the options to the top of the file in one, the other had myserversettings)
 
Last edited:
it super easy... i'm looking at itegrating an interest/investment system to the game - with random chance to loose money/make tons of money, and another option to have regular interest paid per gameday. it'll add a bit of "betting" to the game.
 
Sounds like a fun idea! :D
Post automatically merged:

Here, I'll attach the final version of the file again - it's really confusing when the forum merges the messages with the same file attached, I think I also got confused and maybe I replaced one of the files with the older one, I dunno *shrug*. At any rate, you can check against this file to ensure that everything is in place.
 

Attachments

  • PlayerVendor.cs
    80 KB · Views: 4
Last edited:
now that i think about it... that's basically what ladyluck does... Hmm.... maybe just adding a few routines to her for different betting options might be easier...

I've integrated your playervendor changes! What are you doing to work on next?

i also uploaded my client to the dropbox.. it's odd since all you have to do is overwrite a few files, but heh :)
 
I think I'll take a look at integrating the PV system into the task scheduler, and then I'll most likely think about a couple more random spawning ideas I have - for instance, I have a vague idea how we can spawn random blues and random reds at random using an automated script, but not yet sure if the idea will pan out :)
 
Back