Sorry your browser is not supported!

You are using an outdated browser that does not support modern web technologies, in order to use this site please update to a new browser.

Browsers supported include Chrome, FireFox, Safari, Opera, Internet Explorer 10+ or Microsoft Edge.

DLL Talk / The Matrix1Utils plugins collection

Author
Message
Sven B
19
Years of Service
User Offline
Joined: 5th Jan 2005
Location: Belgium
Posted: 25th Apr 2011 18:50
Quote: "SET MATRIX4 TO OBJECT"


Probably very late but: Thanks for listening to my request!

Sven B

IanM
Retired Moderator
21
Years of Service
User Offline
Joined: 11th Sep 2002
Location: In my moon base
Posted: 25th Apr 2011 19:20
I do actually get around to some of these suggestions eventually.

Here's a bonus:


@Jeff,
I'll look into the problem.

Phaelax
DBPro Master
20
Years of Service
User Offline
Joined: 16th Apr 2003
Location: Metropia
Posted: 2nd May 2011 05:50
You think you could put in a tolerance variable for the FILL command? So gaps of only 1 pixel in a shape's border aren't an issue? I have a shape where it's border changes constantly and sometimes the fill will paint the entire screen, causing a frame or two of flicker.

Hockeykid
DBPro Tool Maker
16
Years of Service
User Offline
Joined: 26th Sep 2007
Location:
Posted: 29th May 2011 21:38
If its not to much of a bother, could you possible update the string parsing commands from Matrix1Util 16 to return a blank string if the size parameter is less than 0.

Qqite
14
Years of Service
User Offline
Joined: 28th Feb 2010
Location: Florida, U.S.
Posted: 31st May 2011 03:13 Edited at: 31st May 2011 03:15
Hey I get an error when using you're Num15 pack. Whenever I use any function it comes up with an error saying "Program can't start because MSVCR71.dll does not exist". When I don't use it it runs fine. Only other addins I have is Sparky's and MultiSync.

http://imageshack.us/photo/my-images/860/matrixerror.png/

Ventures of the worlds around us are limited only by our imagination.
IanM
Retired Moderator
21
Years of Service
User Offline
Joined: 11th Sep 2002
Location: In my moon base
Posted: 31st May 2011 15:42
From my first post:
Quote: "If the DLLs fail to load, then you may need the files in the following download:
VC++ redistributables : http://forumfiles.thegamecreators.com/?i=959271

- For 32 bit systems, place the contents in c:\Windows\System32
- For 64 bit systems, place the contents in c:\Windows\SysWOW64
- Alternatively, if you are uncomfortable placing these files in those folders, or if you don't have the correct permissions to do so, place the files in the same directory as your executable."



@hockeykid,
I prefer not to, as doing that hides bugs IMO. You wouldn't believe the number of string bugs that are hanging around out there with the DBPro commands (Lee released a beta a few years ago that errored on these kind of things and had to withdraw it due to the number of bugs triggered).

Hockeykid
DBPro Tool Maker
16
Years of Service
User Offline
Joined: 26th Sep 2007
Location:
Posted: 1st Jun 2011 00:15
Quote: "I prefer not to, as doing that hides bugs IMO. "


I agree, the real reason I wanted it was because I planned on swapping the DBPro ones out in the FPSC source for yours. Unfortunately its a bit more of a hassle, as Lee doesn't check if the size is greater than 0.

For example, this line:



"mid" can be 0 and if it is, with your fast left$() I would get an error.

I do understand your reasoning though

IanM
Retired Moderator
21
Years of Service
User Offline
Joined: 11th Sep 2002
Location: In my moon base
Posted: 3rd Jun 2011 00:17


However, that's probably the wrong way to look at the problem. Don't think 'how can I replace that one command with a faster direct equivalent', but 'how can I use any commands to replace that whole line'.

For instance, 'removeedgespaces' looks at first glance to be a slower version of TRIM.
Sometimes, it's faster and easier to specify what you want to REMOVE$ from a string instead of specifying what you want to keep.
Most times it's faster to SPLIT STRING than search and split on delimiters.
It's faster and easier to use a single command (INSTR) to search for a character in a string instead of checking in a FOR loop.

Let's face it - DBPro's native string handling is fairly basic, so every time you can replace many commands with simpler combination of higher-level commands you're going to get a win, either in simplicity of code, speed of execution, or both.

Hockeykid
DBPro Tool Maker
16
Years of Service
User Offline
Joined: 26th Sep 2007
Location:
Posted: 5th Jun 2011 22:17
Quote: "For instance, 'removeedgespaces' looks at first glance to be a slower version of TRIM.
Sometimes, it's faster and easier to specify what you want to REMOVE$ from a string instead of specifying what you want to keep.
Most times it's faster to SPLIT STRING than search and split on delimiters.
It's faster and easier to use a single command (INSTR) to search for a character in a string instead of checking in a FOR loop.
"


Thanks for the idea, I hadn't taken a full look through your Matrix 16 documentation.

Scraggle
Moderator
20
Years of Service
User Offline
Joined: 10th Jul 2003
Location: Yorkshire
Posted: 11th Jun 2011 12:53 Edited at: 11th Jun 2011 13:07
Hi Ian,
Can I suggest an update to your find free xxxx commands?

They work great at the moment but I often find the need to find a number of free images that I can guarantee are sequential. The only way to do that now is to do it in DBP code which is slow. I'm sure your system could do it faster.

Example:
find free image() - stays unaffected
find free images(16) - returns the first free image and guarantees that (at the time of asking) the next 15 are also free.

Thanks

[EDIT]
On another note, in this thread: How to access DBPro objects and functions from Plugins?. When asked how to access objects, sprites etc. for your own plugins, you said "I've got a load of notes that I've assembled over time for things that work for me and I'm planning on tidying them up and posting them somewhere."
I was wondering if that ever came about? If it did I must have missed it but I would find it very useful. Did it ever get posted?

Thanks again

IanM
Retired Moderator
21
Years of Service
User Offline
Joined: 11th Sep 2002
Location: In my moon base
Posted: 12th Jun 2011 19:52
Currently I have:
ResourceID = FIND FREE XXXXX()
ResourceID = FIND FREE XXXXX(Start, RangeSize)

In addition, you want:
ResourceID = FIND FREE XXXXX(NumberOfItems)
ResourceID = FIND FREE XXXXX(Start, RangeSize, NumberOfItems)

I'll have to think about how to implement that over the current system, then I'll need to add all of the functions (58 of them) ... that'll take some time I'm afraid, especially now that you've also reminded me of those notes that need cleaning up and posting somewhere

How do you see those new commands working with the RESERVE FREE XXXXX and RELEASE RESERVED XXXXX functions that I've recently implemented? (That's potentially another 58 or 87 functions there too).

Scraggle
Moderator
20
Years of Service
User Offline
Joined: 10th Jul 2003
Location: Yorkshire
Posted: 13th Jun 2011 12:32 Edited at: 13th Jun 2011 12:45
I have somehow managed to overlook the RESERVE FREE XXXXX commands ... they could be very handy!
As for how would I see them working, then from a users point of view I would expect that RESERVE FREE IMAGE(16) would return the ID of the first image and also reserve the next 15 images. RELEASE RESERVED IMAGE() would maintain its original use. Although in an ideal world (where you have an infinite amount of time and patience!) RELEASE RESERVED IMAGE(ID, 16) would attempt to release image ID and the following 15 - failing silently so that any images that have been released or deleted do not cause errors.

On another note: I've just been looking through your commands to see if there is anything else that I have overlooked and came across the FREELIST commands, which begs the question - What is a freelist? I see there are many commands to deal with them but none of the help files (that I found) actually mentioned what a freelist is.

IanM
Retired Moderator
21
Years of Service
User Offline
Joined: 11th Sep 2002
Location: In my moon base
Posted: 13th Jun 2011 17:06 Edited at: 13th Jun 2011 19:17
A freelist is pretty much a user-defined resource.

For example, you could create an array with a number of items, a freelist with the same number of items, then use the freelist to allocate items from within the array.

[edit]
Here's example code. Hit 'a' to allocate array items from the freelist, and the number keys 0-9 to return that item to the freelist.


Burning Feet Man
16
Years of Service
User Offline
Joined: 4th Jan 2008
Location: Sydney, Australia
Posted: 15th Jun 2011 06:24
Very cool IanM. I'll have a play with this tonight.

Help build an online DarkBASIC Professional help archive.
DarkBasic Help Wikia
Sph!nx
15
Years of Service
User Offline
Joined: 3rd Dec 2008
Location: The Netherlands
Posted: 17th Jun 2011 10:28
Thanks for all your efforts, Ian. You made my coding life a little easier and I'm sure I speak for many. Thanks again and keep it up!

Regards Sph!nx
http://www.mental-image.net
Scene Commander
Support Manager
15
Years of Service
User Offline
Joined: 3rd May 2008
Location:
Posted: 20th Jun 2011 08:58
Quote: "Thanks for all your efforts, Ian"


And thanks from me, I use all of your additions as a standard part of my DBP set up and find them invaluable.

http://jimjamsgames.yolasite.com
Olby
20
Years of Service
User Offline
Joined: 21st Aug 2003
Location:
Posted: 26th Jun 2011 04:21 Edited at: 26th Jun 2011 04:49
Hey Ian, is there any chance of seeing a MAKE IMAGE FROM POINTER command in your collection? I know we have a memblock version but it will always be slower due to necessity to create a memblock from a pointer. There's an added bonus if you could implement both LOAD IMAGE overloads which MAKE IMAGE FROM MEMBLOCK is missing- Texture Flag and Divide Texture Size. This would mean we can run full games without extracting anything from resource archives which in turn means faster loading times. Thanks!

ACER Aspire 5920G: Core2Duo 2.2GHZ, 2GB, GeForce 8600M GT 1280MB, Windows Vista Ultimate SP1, DBPro 7.5 + PureGDK 2.0b
IanM
Retired Moderator
21
Years of Service
User Offline
Joined: 11th Sep 2002
Location: In my moon base
Posted: 2nd Jul 2011 19:53
It's certainly something I could do. I'll add it into my ever-growing list.

Olby
20
Years of Service
User Offline
Joined: 21st Aug 2003
Location:
Posted: 3rd Jul 2011 01:42 Edited at: 3rd Jul 2011 01:47
Nice. Might as well then ask for MAKE SOUND FROM POINTER Pointer,Sound Number,Flag,Silent Fail,Global Sound Flag

I know it's not nice to ask for a freebie like this, but hey, why not if it'll help the community. You're a good man. Thanks!

ACER Aspire 5920G: Core2Duo 2.2GHZ, 2GB, GeForce 8600M GT 1280MB, Windows Vista Ultimate SP1, DBPro 7.5 + PureGDK 2.0b
Manson_NS
19
Years of Service
User Offline
Joined: 4th May 2004
Location: Denmark
Posted: 8th Jul 2011 11:06
Seeing as this is not the first time I post something that might be interpreted as a complaint - let it be said that it's only because I really make an extensive use of your very nice package Ian - and thank you for it, and the continued updates!

That beeing said - has the 'BIT INTERSECT MASK' gone fishing, or have I screwed up my installation? I imagine a lot of people are using this function on a regular basis, so I'd be reluctant to claim it to be a bug.
Scraggle
Moderator
20
Years of Service
User Offline
Joined: 10th Jul 2003
Location: Yorkshire
Posted: 8th Jul 2011 11:20
Quote: "I really make an extensive use of your very nice package Ian"


OK, so I like childish humour, but that made me smile over my morning coffee

Manson_NS
19
Years of Service
User Offline
Joined: 4th May 2004
Location: Denmark
Posted: 8th Jul 2011 11:23
Ah, thank you for pointing that one out!
If you can't laugh at yourself...
Good thing it's friday
IanM
Retired Moderator
21
Years of Service
User Offline
Joined: 11th Sep 2002
Location: In my moon base
Posted: 8th Jul 2011 15:21
But how do you think I feel? That's my package you guys are laughing at!

Anyhow, I'll get that fixed.

@Olby, I'll add that to my list too.

Green Gandalf
VIP Member
19
Years of Service
User Offline
Joined: 3rd Jan 2005
Playing: Malevolence:Sword of Ahkranox, Skyrim, Civ6.
Posted: 8th Jul 2011 22:42
Quote: "Anyhow, I'll get that fixed."


Which package?
BatVink
Moderator
20
Years of Service
User Offline
Joined: 4th Apr 2003
Location: Gods own County, UK
Posted: 8th Jul 2011 23:05
Is there a command that can get the screen height, taking account of the windows task bar at the bottom of the screen if it is set to be always showing?

One of the reasons my AppUp game failed validation is that on a 1024x600 display, my 600 high window disappears behind the task bar and I need to adjust for this.

IanM
Retired Moderator
21
Years of Service
User Offline
Joined: 11th Sep 2002
Location: In my moon base
Posted: 9th Jul 2011 01:25 Edited at: 9th Jul 2011 01:33
Almost.

There's no command to get the desktop window (I've just added it). The command to get the client-area height from a window handle was broken (I've just fixed it), and the client width/height thing didn't work properly for the desktop window anyway (I've just corrected that).

So now it does
Fixed DLL attached.

[EDIT]
Forgot the example code...


Attachments

Login to view attachments
Diggsey
17
Years of Service
User Offline
Joined: 24th Apr 2006
Location: On this web page.
Posted: 11th Jul 2011 00:26
I have a feature request either for these plugins or for DBPro itself:
As I understand it, each time items are added or removed from an array, a new array is allocated, the contents are copied over, and the old array is deleted. In my program I'm making heavy use of stacks, and I believe the number of reallocations is slowing the program down significantly.
Would it be possible to make it so that whenever a new array is allocated it gives it some extra space at the end?

An alternative option which may be better is if you add some better stack/queue commands which work on arrays more efficiently, and have this logic built in. The size of the array would become its capacity, and there would be another command to get the number of items in the stack or queue.

[b]
IanM
Retired Moderator
21
Years of Service
User Offline
Joined: 11th Sep 2002
Location: In my moon base
Posted: 11th Jul 2011 02:31
I will take a look - the problem is that there are no empty fields left in the 'official' array header and changing that would require compiler changes. I'm a bit reluctant to put 'fixes' to default behaviour in my code though. I'll come up with something.

In the meantime, rather than use the stack command, you can use the array command and control the growth of the array yourself. Here I use the current array index as the top of the stack and grow either by 2 or double the array size (those numbers picked only to show a couple of array growths - choose something more relevant for yourself):


Diggsey
17
Years of Service
User Offline
Joined: 24th Apr 2006
Location: On this web page.
Posted: 11th Jul 2011 15:09 Edited at: 11th Jul 2011 15:13
Cool, thanks! I thought of using the array index to do it but didn't realise it would be that easy. I'm never quite sure which commands will modify the array index or what the exact behaviour is when an index is outside the array, as the help files are a bit ambiguous in that respect.

I'll probably just write my own versions of "add to stack"/"remove from stack" in DBPro using that code and replace "array count" calls with "get array index". The problem is, you can't easily pass arrays into functions, and by modifying the array the array pointer could move so I'll have to do a fair bit of linking and unlinking arrays.

[b]
Hodgey
14
Years of Service
User Offline
Joined: 10th Oct 2009
Location: Australia
Posted: 11th Jul 2011 15:32
Hi IanM, you've probably heard this 1000 times but you get to hear it again, your plugins are absolutely amazing!

I have a suggestion though, a recent issue that has come up is the compatablility of DBPro applications and dual monitor setups. Some setups will run a DBPro app while others cause the same app to crash. I don't have a dual monitor set up so I cannot thoroughly test what crashes and what doesn't but this problem has been reported to me. Apparently, windowed versions work fine while fullscreen/fulldesktop cause the program to crash. Would you be able to add commands that handle dual monitors or atleast tell us if the user is using a dual monitor set up?

Cheers Hodgey

Diggsey
17
Years of Service
User Offline
Joined: 24th Apr 2006
Location: On this web page.
Posted: 11th Jul 2011 15:44 Edited at: 11th Jul 2011 15:59
I've just been trying to turn your code into a function, but I've had to do this:


The calling code has to be complicated because link array seems to crash if called with the pointer already being used by the array. (Presumably because it frees the existing pointer first?)

Is there a simpler way to do this, and will this work for arrays of any type despite temp() being an integer array? At the moment it's easier to put a copy of the stack code at every "add to stack"

[b]
IanM
Retired Moderator
21
Years of Service
User Offline
Joined: 11th Sep 2002
Location: In my moon base
Posted: 11th Jul 2011 16:40
Quote: "link array seems to crash if called with the pointer already being used by the array. (Presumably because it frees the existing pointer first?)"

No, it's because the array is being freed twice - LINK ARRAY frees the memory currently used by the array, and then updates the array variable with the new memory. In your code though, you've expanded the array, which has already freed the old memory as part of resizing the array with ARRAY INSERT AT BOTTOM.

I would have coded like this when pushing:


... and this when popping:

... but I can see why you'd want to have similar looking push/pop code.

Also, don't worry about the efficiency of linking/unlinking - they are literally the simplest commands in the whole array plug-in.

@Hodgey,
I'll look into it. There's one question remaining for you to answer though - if I can only detect that multiple monitors are in place, then what's your program going to do about it anyway?

Diggsey
17
Years of Service
User Offline
Joined: 24th Apr 2006
Location: On this web page.
Posted: 11th Jul 2011 17:45
Ah, that explains it
TBH, it's simpler just to write the two lines of code to do the push operation each time, so I've done that:


(In my usage the stack will probably always reach the same height, so I didn't bother increasing the size more than necessary, I just don't reduce the size ever)

[b]
Hodgey
14
Years of Service
User Offline
Joined: 10th Oct 2009
Location: Australia
Posted: 12th Jul 2011 01:14 Edited at: 12th Jul 2011 01:15
Quote: "I'll look into it. There's one question remaining for you to answer though - if I can only detect that multiple monitors are in place, then what's your program going to do about it anyway?
"

That is a good question. Apparently, DBPro applications work normally in windowed mode but can crash in fullscreen/fulldesktop mode. So what people could do is check if the user is using multiple monitors, if so set the program to a windowed mode, if not set it to fullscreen/desktop.

In code form, something like this


Quote: "I'll look into it."

Thanks IanM

P.S
While I was on holiday recently, I was walking through an arcade games place and there was a Dance Dance Revolution machine there. I was watching the screen for a few seconds and the highscores appeared. Now, you can't make up stuff like this, the highest score was achieved by "IanM". You must be a pretty good dancer!

Duffer
21
Years of Service
User Offline
Joined: 9th Feb 2003
Location: chair
Posted: 23rd Jul 2011 13:16 Edited at: 23rd Jul 2011 13:54
@ IanM,

Being dumb as usual. Sort Array Range and Reverse Sort Array Range.

If you had an array as a type with say name, age, height, and you just wanted to sort by name - what would that look like - do you have to cover off all the type stuff (name,age,height) in the command or just the first of these? (hope you get what I am asking!)

Also, does Sort Array Range work with multi dimensional arrays which are UDT>?

a long time dabbler with DBC and DBPro with no actual talent but lots of enthusiasm...
IanM
Retired Moderator
21
Years of Service
User Offline
Joined: 11th Sep 2002
Location: In my moon base
Posted: 23rd Jul 2011 16:43
First, I'd advise not using multi-dimensional arrays if you can get around it some other way - you can do it if you wish by using the 'range' commands, but you have to work out the offsets within the arrays yourself.

Sorting an array on single or multiple fields is fairly simple:


You just specify from 1 to 6 field numbers after the array name.

Duffer
21
Years of Service
User Offline
Joined: 9th Feb 2003
Location: chair
Posted: 23rd Jul 2011 16:45
@ IanM,

Simples - thanks

Any way to copy one UDT Array to another 'empty' one simply? Had a look at command list and nothing obvious?

a long time dabbler with DBC and DBPro with no actual talent but lots of enthusiasm...
IanM
Retired Moderator
21
Years of Service
User Offline
Joined: 11th Sep 2002
Location: In my moon base
Posted: 23rd Jul 2011 17:03
No, I currently have no commands that operate on multiple arrays.

Duffer
21
Years of Service
User Offline
Joined: 9th Feb 2003
Location: chair
Posted: 23rd Jul 2011 17:11
What about a command that copies a UDT single dimension array to another clear or empty one with the same structure and udt?

a long time dabbler with DBC and DBPro with no actual talent but lots of enthusiasm...
IanM
Retired Moderator
21
Years of Service
User Offline
Joined: 11th Sep 2002
Location: In my moon base
Posted: 23rd Jul 2011 17:35
Isn't that the same question? It's the same answer anyhow

Duffer
21
Years of Service
User Offline
Joined: 9th Feb 2003
Location: chair
Posted: 23rd Jul 2011 17:40
@ IanM,

Sorry - see what you mean - I had misread your response in terms of multiple dimensions in arrays rather than simply commands dealing with multiple arrays.... Doh!

No matter, sure I can drum something up.

Finally got around to creating my own database system and I'm using your v useful save/load array to/from datafile commands...

a long time dabbler with DBC and DBPro with no actual talent but lots of enthusiasm...
Duffer
21
Years of Service
User Offline
Joined: 9th Feb 2003
Location: chair
Posted: 23rd Jul 2011 19:41 Edited at: 23rd Jul 2011 19:49
@ IanM,

Why does the following code crash....? :-


p.s. it crashes for me at Sort Array Range, if I take away the range 0-12 and just do "sort array" I get the same crash?

a long time dabbler with DBC and DBPro with no actual talent but lots of enthusiasm...
IanM
Retired Moderator
21
Years of Service
User Offline
Joined: 11th Sep 2002
Location: In my moon base
Posted: 24th Jul 2011 00:39
Darn. It's a bug triggered by null strings.

If you run the following code just before the sort, it will change the nulls to empty strings and fix the problem until I get a proper fix out.


Duffer
21
Years of Service
User Offline
Joined: 9th Feb 2003
Location: chair
Posted: 24th Jul 2011 01:19
@ IanM,

Cheers that sorted it (excuse the pun).

Say, any chance with the normal Sort Array that it puts the blank or null arrays AFTER the arrays sorted A,B,C,D?

As an option?

Would make things quite a bit easier in certain circs. Does one of the option methods of array sort do that already?

a long time dabbler with DBC and DBPro with no actual talent but lots of enthusiasm...
Cetobasilius
14
Years of Service
User Offline
Joined: 29th Dec 2009
Location: Mexico
Posted: 6th Aug 2011 01:24
Any chance you will make a lib for DGDK?

hi
Argon Knight
21
Years of Service
User Offline
Joined: 29th Aug 2002
Location: Gastonia, NC, USA
Posted: 6th Aug 2011 08:06 Edited at: 6th Aug 2011 08:07
Quote: "Matrix1Util_22 - 1.1.0.13
- Added RESERVE FREE DATAFILE, RELEASE RESERVED DATAFILE and COROUTINE DATAFILE commands/functions.
"


I'm not finding the COROUTINE DATAFILE command in this latest release. Is this a future command?
IanM
Retired Moderator
21
Years of Service
User Offline
Joined: 11th Sep 2002
Location: In my moon base
Posted: 6th Aug 2011 14:32
No, it's a typo - I'm not sure where my head was when I typed that as it should have been DATAFILE RESERVED.

@Cetobasilius,
I have been asked many times - the thing is that I don't use the GDK very much at all (haven't looked at it this year, except for a few bug fixes). Generally what you get with these plug-ins, are commands that I needed myself at the time and have shared with everyone else.

@Duffer,
In the short term, add an extra integer field - set it to 1 if the string has data, or set/leave it as zero if the string doesn't have data. Then when you sort, sort by this field reversed before you sort by any other field - that will automatically throw all of the null & empty string UDT's to the end of the array.

Alternatively, only put UDT's into the array when they are needed:


Cetobasilius
14
Years of Service
User Offline
Joined: 29th Dec 2009
Location: Mexico
Posted: 6th Aug 2011 15:15
thats ok IanM, im looking forward to 12 - Limb information and updates, any way i can do this on my own? (like getting what texture some limb has on stage 2)

hi
Argon Knight
21
Years of Service
User Offline
Joined: 29th Aug 2002
Location: Gastonia, NC, USA
Posted: 6th Aug 2011 19:21
Sorry if this question is redundant, I didn't find a quick answer with the forum search:

Is there a way we can use Matrix1 Utilities with DarkGDK?
IanM
Retired Moderator
21
Years of Service
User Offline
Joined: 11th Sep 2002
Location: In my moon base
Posted: 6th Aug 2011 21:18
No, that's what Cetobasilius was asking about.

@Cetobasilius,
Get a pointer to your object using dbGetObject(). In the structure that's returned is a pointer to an array of sFrame objects - each of these relate to a limb. Within each frame, there's a pointer to an sMesh object (which may be NULL if there is no mesh for that limb) containing details of the mesh, texturing and various rendering settings.

Here's a quick 'code' summary:


Login to post a reply

Server time is: 2024-03-28 22:32:54
Your offset time is: 2024-03-28 22:32:54