Skip to content

Commit e46c527

Browse files
committedNov 5, 2013
Accept hexadecimal and string values for seeds
1 parent 1a96987 commit e46c527

File tree

6 files changed

+68
-2
lines changed

6 files changed

+68
-2
lines changed
 

‎src/emerge.cpp

+4-1
Original file line numberDiff line numberDiff line change
@@ -351,8 +351,11 @@ MapgenParams *EmergeManager::getParamsFromSettings(Settings *settings) {
351351
if (!mgparams)
352352
return NULL;
353353

354+
std::string seedstr = settings->get(settings == g_settings ?
355+
"fixed_map_seed" : "seed");
356+
354357
mgparams->mg_name = mg_name;
355-
mgparams->seed = settings->getU64(settings == g_settings ? "fixed_map_seed" : "seed");
358+
mgparams->seed = read_seed(seedstr.c_str());
356359
mgparams->water_level = settings->getS16("water_level");
357360
mgparams->chunksize = settings->getS16("chunksize");
358361
mgparams->flags = settings->getFlagStr("mg_flags", flagdesc_mapgen);

‎src/map.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -3507,7 +3507,7 @@ void ServerMap::loadMapMeta()
35073507
m_seed = mgparams->seed;
35083508
} else {
35093509
if (params.exists("seed")) {
3510-
m_seed = params.getU64("seed");
3510+
m_seed = read_seed(params.get("seed").c_str());
35113511
m_mgparams->seed = m_seed;
35123512
}
35133513
}

‎src/util/numeric.cpp

+44
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
2222

2323
#include "../log.h"
2424
#include "../constants.h" // BS, MAP_BLOCKSIZE
25+
#include <string.h>
2526
#include <iostream>
2627

2728
// Calculate the borders of a "d-radius" cube
@@ -139,6 +140,49 @@ int myrand_range(int min, int max)
139140
return (myrand()%(max-min+1))+min;
140141
}
141142

143+
// 64-bit unaligned version of MurmurHash
144+
u64 murmur_hash_64_ua(const void *key, int len, unsigned int seed)
145+
{
146+
const u64 m = 0xc6a4a7935bd1e995;
147+
const int r = 47;
148+
u64 h = seed ^ (len * m);
149+
150+
const u64 *data = (const u64 *)key;
151+
const u64 *end = data + (len / 8);
152+
153+
while (data != end) {
154+
u64 k;
155+
memcpy(&k, data, sizeof(u64));
156+
data++;
157+
158+
k *= m;
159+
k ^= k >> r;
160+
k *= m;
161+
162+
h ^= k;
163+
h *= m;
164+
}
165+
166+
const unsigned char *data2 = (const unsigned char *)data;
167+
switch (len & 7) {
168+
case 7: h ^= (u64)data2[6] << 48;
169+
case 6: h ^= (u64)data2[5] << 40;
170+
case 5: h ^= (u64)data2[4] << 32;
171+
case 4: h ^= (u64)data2[3] << 24;
172+
case 3: h ^= (u64)data2[2] << 16;
173+
case 2: h ^= (u64)data2[1] << 8;
174+
case 1: h ^= (u64)data2[0];
175+
h *= m;
176+
}
177+
178+
h ^= h >> r;
179+
h *= m;
180+
h ^= h >> r;
181+
182+
return h;
183+
}
184+
185+
142186
/*
143187
blockpos: position of block in block coordinates
144188
camera_pos: position of camera in nodes

‎src/util/numeric.h

+2
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,8 @@ int myrand_range(int min, int max);
222222
Miscellaneous functions
223223
*/
224224

225+
u64 murmur_hash_64_ua(const void *key, int len, unsigned int seed);
226+
225227
bool isBlockInSight(v3s16 blockpos_b, v3f camera_pos, v3f camera_dir,
226228
f32 camera_fov, f32 range, f32 *distance_ptr=NULL);
227229

‎src/util/string.cpp

+16
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
1919

2020
#include "string.h"
2121
#include "pointer.h"
22+
#include "numeric.h"
2223

2324
#include "../sha1.h"
2425
#include "../base64.h"
@@ -136,3 +137,18 @@ char *mystrtok_r(char *s, const char *sep, char **lasts) {
136137
*lasts = t;
137138
return s;
138139
}
140+
141+
u64 read_seed(const char *str) {
142+
char *endptr;
143+
u64 num;
144+
145+
if (str[0] == '0' && str[1] == 'x')
146+
num = strtoull(str, &endptr, 16);
147+
else
148+
num = strtoull(str, &endptr, 10);
149+
150+
if (*endptr)
151+
num = murmur_hash_64_ua(str, (int)strlen(str), 0x1337);
152+
153+
return num;
154+
}

‎src/util/string.h

+1
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,7 @@ size_t curl_write_data(char *ptr, size_t size, size_t nmemb, void *userdata);
321321
u32 readFlagString(std::string str, FlagDesc *flagdesc);
322322
std::string writeFlagString(u32 flags, FlagDesc *flagdesc);
323323
char *mystrtok_r(char *s, const char *sep, char **lasts);
324+
u64 read_seed(const char *str);
324325

325326
#endif
326327

0 commit comments

Comments
 (0)
Please sign in to comment.