-
Posts
7 -
Joined
-
Last visited
-
Days Won
1
Xandrah last won the day on May 25
Xandrah had the most liked content!
Recent Profile Visitors
The recent visitors block is disabled and is not being shown to other users.
Xandrah's Achievements
-
Greetings everyone! Alright so I would like to show some of my brainstorming! For the moment we mostly archive old Active Worlds content and use a old browser that we were licensed to use. Lucky the protocol of 5.2 allows 6.2 and onwards, I have been asked a few times by users will we support the latest versions of Active Worlds, no this is something we will not do, and do not wish to do, if you prefer to use the latest versions I will point you to the official website that runs Active Worlds, using any modern browsers like 7.0/9.0+ would be considered illegal as our white label license would not support such upgrades that require fees, our servers are not even compatible anyway! Moving forward with DeltaWorlds 6.x Live Client Updates - I will be pushing out an update soon that updates our engine to the latest open source code, I am just having to redo a few client calls to get everything working, our integrated browser which is Chrome Embedded Framework (CEF) has also been updated to improve compatibility with new websites, all http calls will soon be blocked and everyone hosting ops/images will need to start using HTTPS only. Our embedded player has had a new compile and fixes to playlist management so embedded youtube videos work once again. A release should be live in the next few months. VOIP - We are working on ways to integrate WebRTC with the current live client, as embedded voice is very crusty. I will need some volunteers for this test as I am mute in real life and have to communicate with ASL Future Client/Server - Some fantastic community members are spearheading progress on our own SDK that does not require anything to do with Active Worlds, we are also working on efforts of our own browser and world server/universe authentication that will step away from anything ActiveWorlds. The browsers graphical engine will be based on Unreal along with a entirely new browser coded in .NET making it much more compatible with Linux without us needing to use Wine. These are vast brainstorming ideas, but progress is being made and I hope you all will be along for the ride, I am very happy to see people appreciating our efforts, and I appreciate the help I am also receiving from the community, great to see new builds and also people appreciating our archived worlds from AW. Engine Ideas (UE or BGFX) - Depending on where we go with our live client, the best form of action would be https://github.com/bkaradzic/bgfx This is what we currently use a very primitive version of in 6.x and would like to expand its use, or move entirely to Unreal Engine, its currently a balancing act, as creating a VR chat platform on Unreal may bring in costs and legalities with Unreal Engine, more users who use it, UE may start wanting a license fee. Bingo/Events - I am currently in the process of reviving Bingo and a few in world events, that will award the user something called fun tokens, that can be used for free in our upcoming shopping mall and world upgrade tools. I would like to keep the community stimulated with events, and anyone who wishes to host such events get as much help as they need from myself and staff. VR Banking - Work in progress, a fun banking system for buying plots of land in our main building world (in development) these credits are acquired from participating in events, or just generally logging into DW daily, none of this will be done for real world cash. We are also in development of DeltaWorlds - Grid which is based on the open source code of OpenSim/SecondLife, this will not take over DeltaWorlds 6, this will be a separate project that will not impact anything on our main universe. Many thanks for reading -Xan
-
- 1
-
-
Its great to see these events went well.
-
Xandrah changed their profile photo
-
A great milestone indeed, I am happy to see people are checking out the archived history of ActiveWorlds
-
#define AW_NO_FUNCTION_MAPPING // for UTF-8 or older single-byte and multi-byte character sets #include <windows.h> #include "reasons.h" #include "aw.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #define MAX_AVATARS_IN_SCENE 35 #define MAX_HUD_LINES 10 #define MAX_LINE_LENGTH 50 #define MAX_HUD_LINE_LINES 5 #define HEARTBEAT_INTERVAL 30 struct AVATAR { int session; char name[18]; }; struct HUD_LINE { int id; int num_lines; char lines[MAX_HUD_LINE_LINES][MAX_LINE_LENGTH + 1]; }; struct AVATAR avatars[MAX_AVATARS_IN_SCENE]; struct HUD_LINE hud_lines[MAX_HUD_LINES]; void handle_avatar_add(void); void handle_avatar_delete(void); void handle_address(int rc); void handle_chat(void); void update_hud_messages(void); void wrap_line(const char* line, struct HUD_LINE* hud_line, int max_line_length); void send_heartbeat(void); // Prototype heartbeat function, keeps bot from timing out int main(int argc, char* argv[]) { int rc; // Check command line if (argc < 4) { printf("To begin type: DWbot1.exe cit-number password world\n", argv[0]); return 1; } // Initialize Delta Worlds API rc = aw_init(AW_BUILD); if (rc != RC_SUCCESS) { printf("Unable to initialize API (reason %d)\n", rc); return 1; } // Variable to track last heartbeat time time_t last_heartbeat = time(NULL); // Install handler for avatar_add, avatar_delete, and chat events aw_event_set(AW_EVENT_AVATAR_ADD, handle_avatar_add); aw_event_set(AW_EVENT_AVATAR_DELETE, handle_avatar_delete); aw_event_set(AW_EVENT_CHAT, handle_chat); /* Install callback for aw_address */ aw_callback_set(AW_CALLBACK_ADDRESS, handle_address); /* create bot instance */ if ((rc = aw_create("auth.deltaworlds.com", 6671, 0)) != 0) { printf("Unable to create bot instance (reason %d)\n", rc); exit(1); } // Log bot into the universe aw_int_set(AW_LOGIN_OWNER, atoi(argv[1])); aw_string_set(AW_LOGIN_PRIVILEGE_PASSWORD, argv[2]); aw_string_set(AW_LOGIN_APPLICATION, "OCMBOTv1"); aw_string_set(AW_LOGIN_NAME, "HUDchat"); rc = aw_login(); if (rc != RC_SUCCESS) { printf("Unable to login (reason %d)\n", rc); return 1; } // Enter bot into the world rc = aw_enter(argv[3]); if (rc != RC_SUCCESS) { printf("Unable to enter world (reason %d)\n", rc); return 1; } // Announce position in the world aw_int_set(AW_MY_X, 1000); // 1W aw_int_set(AW_MY_Z, -7000); // 7S aw_int_set(AW_MY_YAW, 2250); // Face towards GZ rc = aw_state_change(); if (rc != RC_SUCCESS) { printf("Unable to change state (reason %d)\n", rc); return 1; } // Main event loop while (aw_wait(-1) == RC_SUCCESS) { if (difftime(time(NULL), last_heartbeat) >= HEARTBEAT_INTERVAL) { send_heartbeat(); last_heartbeat = time(NULL); // Update the last heartbeat time } // Close everything down aw_destroy(); aw_term(); return 0; } } void send_heartbeat() { // Heartbeat function - sends clear command to chat to keep from timing out. aw_say("/clear"); } void handle_avatar_add(void) { int i; int rc; // Add avatar to the scene for (i = 0; i < MAX_AVATARS_IN_SCENE; i++) { if (avatars[i].session == 0) { avatars[i].session = aw_int(AW_AVATAR_SESSION); strcpy(avatars[i].name, aw_string(AW_AVATAR_NAME)); break; } } aw_address(aw_int(AW_AVATAR_SESSION)); // Say Hello (remove slashes from the following lines to enable greeting message) // // char message[100]; // static char avatar_name[AW_MAX_ATTRIBUTE]; // strcpy(avatar_name, aw_string(AW_AVATAR_NAME)); // sprintf(message, "Ahoy there %s!", avatar_name); // aw_say(message); } void handle_avatar_delete(void) { int i; // Remove avatar from the scene for (i = 0; i < MAX_AVATARS_IN_SCENE; i++) { if (avatars[i].session == aw_int(AW_CHAT_SESSION)) { avatars[i].session = 0; // Mark struct as unused strcpy(avatars[i].name, ""); break; } } // Say Bye (remove slashes from the following lines to enable farewell message) // // char message[100]; // static char avatar_name[AW_MAX_ATTRIBUTE]; // strcpy(avatar_name, aw_string(AW_AVATAR_NAME)); // sprintf(message, "Bye, %s!", avatar_name); // aw_say(message); } void handle_address(int rc) { /* Keep in mind that AW_AVATAR_NAME is not defined within the context of this callback */ int i; char hud_message[100]; char name[256]; char msg[256]; strcpy(name, "<UNKNOWN>"); /* Find name of the avatar */ for (i = 0; i < MAX_AVATARS_IN_SCENE; i++) { if (avatars[i].session == aw_int(AW_AVATAR_SESSION)) { strcpy(name, avatars[i].name); break; } } if (rc != RC_SUCCESS) { sprintf(msg, "%s, I cannot determine your IP address (reason %d)", name, rc); } else { int address; unsigned char* p = (unsigned char*)&address; address = aw_int(AW_AVATAR_ADDRESS); /* The address is in network byte order which means that the most significant byte comes first in memory */ sprintf(hud_message, "%s [%u.%u.%u.%u] enters", name, p[0], p[1], p[2], p[3]); /* log the event to the console */ printf("[%u.%u.%u.%u] %s entered chat.\n", p[0], p[1], p[2], p[3], name); // Shift up old messages etc for (i = 0; i < MAX_HUD_LINES - 1; i++) { hud_lines[i].id = hud_lines[i + 1].id; hud_lines[i].num_lines = hud_lines[i + 1].num_lines; for (int j = 0; j < hud_lines[i].num_lines; j++) { strcpy(hud_lines[i].lines[j], hud_lines[i + 1].lines[j]); } } hud_lines[MAX_HUD_LINES - 1].id = 0; // We don't need the session ID for this message wrap_line(hud_message, &hud_lines[MAX_HUD_LINES - 1], MAX_LINE_LENGTH); // Update HUD messages update_hud_messages(); } } void handle_chat(void) { char message[301]; static char avatar_name[AW_MAX_ATTRIBUTE]; strcpy(avatar_name, aw_string(AW_AVATAR_NAME)); // Check for the "/clear" command if (strcmp(aw_string(AW_CHAT_MESSAGE), "/clear") == 0) { // Clear HUD for (int i = 0; i < MAX_HUD_LINES; i++) { hud_lines[i].id = 0; hud_lines[i].num_lines = 0; } // Display "Chat cleared" message wrap_line("Chat cleared", &hud_lines[MAX_HUD_LINES - 1], MAX_LINE_LENGTH); } else { // Handle normal chat messages snprintf(message, 300, "%s: %s", avatar_name, aw_string(AW_CHAT_MESSAGE)); // Shift up old messages for (int i = 0; i < MAX_HUD_LINES - 1; i++) { hud_lines[i].id = hud_lines[i + 1].id; hud_lines[i].num_lines = hud_lines[i + 1].num_lines; for (int j = 0; j < hud_lines[i].num_lines; j++) { strcpy(hud_lines[i].lines[j], hud_lines[i + 1].lines[j]); } } // Check if the chat message starts with "/me" and remove for action if (strncmp(aw_string(AW_CHAT_MESSAGE), "/me", 3) == 0) { snprintf(message, 300, "%s %s", avatar_name, aw_string(AW_CHAT_MESSAGE) + 4); // +4 to remove the "/me " from the message } hud_lines[MAX_HUD_LINES - 1].id = aw_int(AW_CHAT_SESSION); wrap_line(message, &hud_lines[MAX_HUD_LINES - 1], MAX_LINE_LENGTH); } // Update HUD messages update_hud_messages(); } void wrap_line(const char* line, struct HUD_LINE* hud_line, int max_line_length) { const char* line_end = line + strlen(line); const char* line_start = line; hud_line->num_lines = 0; while (line_start < line_end && hud_line->num_lines < MAX_HUD_LINE_LINES) { const char* line_break = line_start + max_line_length; if (line_break > line_end) { line_break = line_end; } else { while (line_break > line_start && *line_break != ' ') { line_break--; } if (line_break == line_start) { line_break = line_start + max_line_length; } } strncpy(hud_line->lines[hud_line->num_lines], line_start, line_break - line_start); hud_line->lines[hud_line->num_lines][line_break - line_start] = '\0'; hud_line->num_lines++; line_start = line_break; while (*line_start == ' ') { line_start++; } } } void update_hud_messages(void) { int rc; // Destroy old HUD elements for (int i = 0; i < MAX_HUD_LINES; i++) { for (int j = 0; j < MAX_HUD_LINE_LINES; j++) { aw_hud_destroy(0, i * MAX_HUD_LINE_LINES + j + 1); } } // Create new HUD elements int y_offset = 0; for (int i = 0; i < MAX_HUD_LINES; i++) { for (int j = 0; j < hud_lines[i].num_lines; j++) { // create the HUD element aw_int_set(AW_HUD_ELEMENT_TYPE, AW_HUD_TYPE_TEXT); aw_string_set(AW_HUD_ELEMENT_TEXT, hud_lines[i].lines[j]); aw_int_set(AW_HUD_ELEMENT_ID, y_offset + 1); aw_int_set(AW_HUD_ELEMENT_SESSION, 0); aw_int_set(AW_HUD_ELEMENT_ORIGIN, AW_HUD_ORIGIN_TOP_LEFT); aw_float_set(AW_HUD_ELEMENT_OPACITY, 1.0f); aw_int_set(AW_HUD_ELEMENT_X, -64); aw_int_set(AW_HUD_ELEMENT_Y, 50 + y_offset * 28); // Adjust the spacing between lines aw_int_set(AW_HUD_ELEMENT_Z, 1); aw_int_set(AW_HUD_ELEMENT_FLAGS, AW_HUD_ELEMENT_FLAG_CLICKS); aw_int_set(AW_HUD_ELEMENT_SIZE_X, 800); aw_int_set(AW_HUD_ELEMENT_SIZE_Y, 30); // Increase the text size aw_int_set(AW_HUD_ELEMENT_FLAGS, AW_HUD_ELEMENT_FLAG_TRANSITION | true); // Set the color to green for the IP address and name announcement message if (strstr(hud_lines[i].lines[j], "enters") != NULL && strstr(hud_lines[i].lines[j], "[") != NULL && strstr(hud_lines[i].lines[j], "]") != NULL) { aw_int_set(AW_HUD_ELEMENT_COLOR, 0x00FF00); // Green color } else { aw_int_set(AW_HUD_ELEMENT_COLOR, 0xFFFFFF); // White color } rc = aw_hud_create(); if (rc != RC_SUCCESS) { printf("Unable to create HUD element (reason %d)\n", rc); } y_offset++; } } }
-
Hello Everyone! As we get further down the line of modern advancements and the power of computers improving every day, we want to keep DeltaWorlds relevent to the masses, of course we will continue to support our AW version of DeltaWorlds but we are in the works to make a totally new client, based on the Second Life codebase. I am hoping to get certain worlds imported and or updated into the platform, along with lots of user friendly features that the base version of Second Life does not have. Our viewer code is going to be based on the open source repo of Firestorm, I am open to suggestions and whoever has experience with the OpenSim code. Currently our grid systems are private, but I hope to provide a public test later down the line.
-
Greetings! We now have our universal custom avatar system working correctly in DeltaWorlds, you should now have your custom avatar synced in every world that has Custom Avatars enabled, we no longer need to rely on local worlds storing your custom avatar.
-
Hello Everyone! Sorry for the change to the forums, I have decided I wanted to go with something more modern for us, especially as we will be expanding to event calendars and support for DW grid system that will run alongside DeltaWorlds 6.2! Please remember to create a new account as your old accounts will not transfer from PHPBB 3.x Thankyou in advance